【问题标题】:C# how to determine the last iteration of foreach loopC#如何确定foreach循环的最后一次迭代
【发布时间】:2019-02-02 03:53:33
【问题描述】:

我正在尝试构建一个函数来计算零之间的数量。 我的函数对于以一个开头和结尾的二进制文件来说做得很好。但问题是如果给定的二进制是 100000,它返回 5。但它应该返回零,因为它不在 1 之间。

这里是代码。

private static int solution1(int N)
{
    string binary = Convert.ToString(N, 2);
    int gap = 0;
    int longestgap = 0;

    foreach (char Z in binary)
    {
        if (Z == '0') gap++;
        if (gap > longestgap) longestgap = gap;
        if (Z == '1') gap = 0;
    }
    return longestgap;
}

【问题讨论】:

  • 为了好玩,您可以去掉任何前导和尾随 0 字符,然后将字符串按 1 拆分并计算最长的子字符串:int longestGap = Convert.ToString(N, 2).Trim('0').Split('1').Max(x => x.Length);
  • 我真的很讨厌引入正则表达式......但是如何对所需模式的匹配进行正则表达式然后最大化结果呢? - 忘了它。 @MatthewWatson 的方法更好。

标签: c# foreach


【解决方案1】:

您只需移动第二个if。您不想每次都覆盖最长的间隙,除非您知道它肯定在两个 1 之间。

if (Z == '0')
{
    gap++;
}
else // if (Z == '1')
{
    if (gap > longestgap)
    {
        longestgap = gap;
    }

    gap = 0;
}

这样,即使间隔一直计数到二进制结束,如果你没有找到第二个'1',最长的间隔仍然是 0。

【讨论】:

  • 不客气。这个顺便说一句不包括像 0001001 这样的二进制文件的情况,因为它会立即开始计数,而不是从第一个 '1' 开始计数。但我认为Convert.ToString(N, 2) 将始终返回带有前导 1 的二进制文件,除非您输入 0。
【解决方案2】:

没有真正测试过,但是这样的东西应该可以工作:

bool firstOneFound = false; // To account for the case "00001"
foreach (char Z in binary)
{
    if (Z == '0')
    {
        if(firstOneFound)
            gap++;
    }
    else if (Z == '1')
    {
        if (gap > longestgap)
            longestgap = gap;

        firstOneFound = true;
        gap = 0;
    }
}

如果您不需要使用foreach 循环,这看起来更简洁:

 for(int i = binary.IndexOf("1"); i < binary.Length; i++)
 {
     char Z = binary[i];
     if (Z == '0')
     {
         gap++;
     }
     else if (Z == '1')
     {
         if (gap > longestgap)
             longestgap = gap;

         gap = 0;
      }
  }

【讨论】:

  • 谢谢@Greg先生,其他答案已经消失了。我不能赞成你的回答,我想知道为什么。
  • 没问题。可能需要等待一段时间才能完成。
猜你喜欢
  • 2010-11-07
  • 2023-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多