C#如何确定foreach循环的最后一次迭代

时间:2018-08-27 15:08:12

标签: c# foreach

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

这是代码。

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;
}

2 个答案:

答案 0 :(得分:2)

您需要做的就是移动第二个if。您不希望每次都覆盖最长的间隔,除非您知道间隔肯定在两个1之间。

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

    gap = 0;
}

这样,即使在二进制开始之前,间隔一直在增加,如果找不到第二个'1',则最长的间隔仍为0。

答案 1 :(得分:0)

尚未经过实际测试,但类似的方法应该起作用:

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;
      }
  }