在给定的二进制数中返回连续的0

时间:2014-02-01 11:40:26

标签: c# binary

我刚刚在C#中练习一些练习。我想在给定的二进制数中返回连续0的数量。例如:

int test1 = 101010;  // Return 1
int test2 = 100101;  // Return 2
int test3 = 100001;  // Return 4
int test4 = 111111;  // Return 0

我已经提出了以下代码,适用于测试1,2& 4但不适用于测试3。

    public static int continuousZeros(int x)
    {

        char[] charArray = x.ToString().ToCharArray();

        int count = 0;
        int total = 0;

        for (int i = 0; i < charArray.Length; i++)
        {
            if (charArray[i] == '0' && charArray[i - 1] == '0')
            {
                count++; 
            }
            else if (charArray[i] == '0' && charArray[i - 1] == '1')
            {
                total = count + 1;
                count = 0;
            }
        }

        return total;
    }

如果我尝试添加另一个,如果:if (charArray[i] == '1' && charArray[i - 1] == '0')我得到 IndexOutofRangeException

我也确定有更有效的方法来实现这个目标吗?

5 个答案:

答案 0 :(得分:2)

  

我也确定有更有效的方法来实现这个目标吗?

您可以使用简单的LINQ语句:

var maxZeroesInString = myString.ToString().Split('1').Max(x => x.Length);

假设您的字符串只有01,您可以拆分1。现在你有一个只包含0的字符串数组,所以你可以找到最长的字符串。

答案 1 :(得分:1)

这样的事情怎么样?

char[] charArray = x.ToString().ToCharArray();
bool zeroControl = false;
List<int> counts = new List<int>();
int currentCount = 0;
for (int i = 0; i < charArray.Length; i++)
{
    if (charArray[i] == '0' && !zeroControl)
    {
         zeroControl = true;
         currentCount++;
    }
    else if (charArray[i] == '0')
    {
         currentCount++;
    }
    else
    {
         zeroControl = false;
         counts.Add(currentCount);
         currentCount = 0;
    }
}
counts.Add(currentCount);
var result = counts.Max();

看起来并不那么优雅,但它适用于所有数字。

答案 2 :(得分:1)

正如其他人所提到的,您正在尝试访问charArray[-1],这会引发异常。这是我的第一直觉:

public static int continuousZeros(int x)
{
    int max = 0;
    int current = 0;

    char[] charArray = x.ToString().ToCharArray();

    for (int i = 0; i < charArray.Length; i++)
    {
        if (charArray[i] == '0')
        {
            current++;
        }
        else
        {
            if (current > max) { max = current; }
            current = 0;
        }
    }

    return max;
}

答案 3 :(得分:1)

您不需要查看位的组合,您可以只计算零位,每当找到一位时,您将计数与最高计数进行比较。

如果您经历从最低位到最高位的位,则最后总会有一位,这意味着在循环之后您不需要检查零位范围。当你遇到最后一点时,这已经得到了解决。

您不需要将数字转换为字符串,您可以选择最低位,直到剩余数字为零。

public static int continuousZeros(int x) {
  int count = 0;
  int highest = 0;
  while (x > 0) {
    if ((x & 1) == 0) {
      count++;
    } else {
      highest = Math.Max(count, highest);
      count = 0;
    }
    x >>= 1;
  }
  return highest;
}

注意:100001之类的数字不是二进制数,它是十进制数,看起来像二进制数。此解决方案处理实际二进制数,即二进制数100001的十进制表示为33

答案 4 :(得分:0)

我对您的代码进行了一些修改,它解决了问题,并给出了正确的结果

public static int continuousZeros(int x)
    {

        char[] charArray = x.ToString().ToCharArray();

        int count = 0;
        int total = 0;

        for (int i = 0; i < charArray.Length; i++)
        {
            if (charArray[i] == '0' )
            {
                count++;
            }
            else  
            {
                total = Math.Max(total,count);
                count = 0;
            }
        }

        return total;
    }