我正在尝试构建一个计算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;
}
答案 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;
}
}