【问题标题】:Splitting a string into evenly-sized chunks将字符串拆分成大小均匀的块
【发布时间】:2021-06-24 05:19:18
【问题描述】:

我有一个挑战要解决,就是将字符串分割成大小均匀的块。

示例 给定string s = "abcdefg"chunks = 3,返回["abc", "de", "fg"]。请注意,1 的其余部分被分配到列表中的第一个元素。

给定string s = "abcdefgh"chunks = 3,返回["abc", "def", "gh"]。再次注意,2 的其余部分被分配到列表中的第一个元素,然后是列表中的第二个元素。

所以,我从旧的 question 那里得到了这个解决方案,但没有考虑“均匀”

        public static IEnumerable<string> Iterator(string s, int chunks)
        {
            for (int i = 0; i < s.Length; i += s.Length - chunks)
            {
                if (i + chunks > s.Length) chunks = s.Length - i;
                yield return s.Substring(i, chunks);

            }

        }


        public static string[] Result(string s, int chunks)
        {
            if (chunks <= 0)
                throw new ArgumentException();

            return Iterator(s, chunks).ToArray();
        }

第二个例子会通过,但第一个没有,我如何调整它以通过两个测试?

【问题讨论】:

标签: c# arrays algorithm


【解决方案1】:

您将块的数量与块的大小混淆了。

您必须使用以下方法计算块大小:

int chunkSize = s.Length / chunks;

如果字符串的长度不能被chunks 整除,这将截断结果,因为这里执行的是整数运算。例如,如果字符串大小为 7 和 chunks = 3,那么这将产生 2。 你还有剩余的1。如果字符串大小为8,则块大小仍为2,但余数为2。现在,您必须将剩余部分分配给各个块。

你可以用模运算符%得到余数:

int remainder = s.Length % chunks;

由于您希望第一个块更大,我们现在将这个剩余部分归因于第一个块:

int start = 0;
while (start < s.Length)
{
    int thisChunkSize = chunkSize;
    if (remainder > 0)
    {
        thisChunkSize++;
        remainder--;
    }
    yield return s.Substring(start, thisChunkSize);
    start += thisChunkSize;
}

如果您需要更好的分布,您可以使用浮点运算和舍入。 MidpointRounding 告诉用 .5 小数舍入一个值时会发生什么。

public static IEnumerable<string> EvenIterator(string s, int chunks)
{
    int start = 0;
    var rounding = new[] { MidpointRounding.ToPositiveInfinity, 
                           MidpointRounding.ToNegativeInfinity };
    int r = 0;
    while (start < s.Length) {
        int chunkSize = (int)Math.Round((double)(s.Length - start) / chunks, rounding[r]);
        r = 1 - r; // Swap the rounding
        yield return s.Substring(start, chunkSize);
        start += chunkSize;
        chunks--;
    }
}

使用"abcdefghijklmno" 和块大小6 的测试给出:

[ "abc", "de", "fgh", "ij", "klm", "no" ]

【讨论】:

  • 非常正确,我现在明白我的错误了。谢谢
猜你喜欢
  • 2014-02-16
  • 2023-04-02
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多