【问题标题】:Divide the elements of a given string划分给定字符串的元素
【发布时间】:2019-03-01 20:29:49
【问题描述】:

我应该把元素分成几个等长的小子串。 子串的数量应该等于给定的分区。如果字符串不能精确划分到给定的分区,我必须使除最后一个以外的所有分区长度相等,并使最后一个 - 最长。

我已尝试制作第一部分,但并非在所有情况下都有效。你能告诉我一种方法吗,但如果可以使用 for 循环等?

例如: {abcd}, 3 个分区 -> {a, b, cd}; {qrstuvwxyz},5 个分区 -> {qr st uv wx yz}

private static List<string> Divide(List<string> input, int index, int partitions)
{
        string stringToDivide = input[index];
        input.RemoveAt(index);
        string add = "";

        if (stringToDivide.Length % partitions == 0)
        {

            for (int i = 0; i < stringToDivide.Length; i++)
            {
                add += stringToDivide[i] + " ";
            }

            input.Insert(index, add.Trim());
        }
        else
        {

        }
        return input;
        Console.WriteLine(string.Join(' ', input));
}

【问题讨论】:

  • 你能给出一些测试用例(预期的输入和输出)吗?
  • @WaiHaLee,是的,我可以。 {abcd}, 3 个分区 -> {a, b, cd}; {qrstuvwxyz},5 个分区 -> {qr st uv wx yz}
  • 一个合适的例子是var result = Divide(new List&lt;string&gt;() { "foo", "bar" }, 2, 3); Console.WriteLine(string.Join(",", result);,然后说出预期的输出字符串是什么。 这是一个我们可以实际运行、在调试器中查看的程序片段,等等。那是明确。再次,帮助我们帮助您。不要让我们做工作来帮助你;您尽您所能帮助我们尽快为您提供解决方案
  • 请记住,作为初学者程序员,您的目标是学习如何编程。让其他人为你做你的工作不会让你成为一名成功的程序员。 组织你的工作、编写测试用例和清楚地描述问题是专业编程的重要组成部分,所以今天就练习这项技能吧。
  • @EricLippert,感谢您向我解释所有这些事情。我一定会在下一篇文章中使用它们。问候,卡洛扬

标签: c# list


【解决方案1】:

你可以这样做:

private static List<string> Divide(List<string> input, int index, int partitions)
{
    var stringToDivide = input[index];
    input.RemoveAt(index);

    var stringToAdd = "";
    var partitionLength = stringToDivide.Length / partitions;

    for (int i = 0, partitionNum = 0; i < stringToDivide.Length; i++)
    {
        if (i % partitionLength == 0 && partitionNum != partitions)  // skip space in last part
        {
            if (i > 0) // do not add leading space
            {
                stringToAdd += " ";
            }

            partitionNum++;
        }

        stringToAdd += stringToDivide[i];
    }

    input.Insert(index, stringToAdd);

    return input;
}

此代码为每个partitionLength 添加空格,但跳过最后一个字符串的空格。请注意,对于长字符串,最好使用StringBuilder

【讨论】:

  • 谢谢!感谢您的帮助!
【解决方案2】:

stringToDivide.Length % partitions是分割成partitions分区数后剩下的字符数。

stringToDivide.Length / partitions 是除最后一个分区外每个分区应包含的字符数,最后一个分区应附加剩余字符。

所以只取第一个partitions 数量的stringToDivide.Length / partitions 长度块,并将剩下的附加到最后一个块。

当字符串可整除时,stringToDivide.Length % partitions 为零,所以不是特殊情况。

【讨论】:

  • 谢谢!感谢您的帮助!
【解决方案3】:
 public static List<string> DivideIntoPartitions(string stringToDivide, int partitions)
        {
            var parts = new List<string>(partitions);
            var len = stringToDivide.Length;

            if (len < partitions)
            {
                throw new ArgumentException("partitions should be less than length");
            }

            if (len % partitions == 0)
            {
                var eachSubstrLength = len / partitions;

                for (int i = 0; i < stringToDivide.Length; i += eachSubstrLength)
                {
                    parts.Add(stringToDivide.Substring(i, eachSubstrLength));
                }
            }
            else
            {
                var nextDivisibleNumber = len + (partitions - (len % partitions));
                var lengthOfLastSubstr = nextDivisibleNumber / partitions;
                var lastItem = stringToDivide.Substring((len - lengthOfLastSubstr));
                stringToDivide = stringToDivide.Remove((len - lengthOfLastSubstr));

                var chunksize = stringToDivide.Length / (partitions - 1);

                for (int i = 0; i < stringToDivide.Length; i += chunksize)
                {
                    parts.Add(stringToDivide.Substring(i, chunksize));
                }
                parts.Add(lastItem);

            }
            return parts;

        }

 var result = DivideIntoPartitions("qrstuvwxyz", 3);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多