我正在用 Hackerrank 编写代码。最近的问题是,将十进制转换为基数 2,然后计算二进制数中最大的连续 1。首先我提出以下解决方案。它工作正常。但是我不明白它的计数部分,即使我写了它。
代码是
int main(){
int n,ind=0, count=0, mmax=0;
char bin[100];
cin >> n;
while(n){
if(n%2==0) {
bin[ind]='0';
n = n / 2;
ind = ind + 1;
}
else if(n%2==1) {
bin[ind]='1';
n = n / 2;
ind = ind + 1;
}
}
for(int i=0; i<=(ind-1); i++){
if(bin[i] == '1' && bin[i+1] == '1'){
count++;
if(mmax < count)
mmax = count;
}
else
count=0;
}
cout << mmax + 1 << endl;
return 0;
}
在上面的代码中,我猜变量 mmax 会给我 1 的最大连续数,但它给我的值是 (max consecutive - 1),所以我只是这样写并提交了代码。但是我很好奇。为什么它以这种方式工作。我对代码的工作方式有点困惑。
谢谢
最佳答案
假设您有这个二进制序列:
11110
您的代码将从第一个和第二个开始进行比较:
|11|110 1 && 1 -> max = 1
1|11|10 1 && 1 -> max = 2
11|11|0 1 && 1 -> max = 3
111|10| 1 && 0 -> max = 3
您可以看到,虽然有 4 个 1,但您只进行了 3 次比较,因此您的最大值始终是实际最大值的 -1。您可以通过在 for 循环之后添加 mmax += 1
来解决此问题。
关于c++ - 计算二进制中连续的 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522344/