我刚刚在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 。
我也确定有更有效的方法来实现这个目标吗?
答案 0 :(得分:2)
我也确定有更有效的方法来实现这个目标吗?
您可以使用简单的LINQ语句:
var maxZeroesInString = myString.ToString().Split('1').Max(x => x.Length);
假设您的字符串只有0
和1
,您可以拆分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;
}