以二进制形式计算连续的 1

count consecutive 1's in binary

本文关键字:连续 计算 二进制      更新时间:2023-10-16

我正在用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个数字,但它为我提供了具有(最大连续-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。您可以通过在循环后添加mmax += 1来解决此问题。

使用小示例仅一点点跟踪将显示为什么。

首先,可以说您的数组中只有1'1'。

由于您需要当前位置和下一个位置为" 1",因此您将始终获得0.

假设我有" 11111"。在第一个" 1"中,由于下一个位置也为" 1",您会增加一次。这重复直到第四'1',到目前为止,您总共将计数增加4次。当您到达5th'1'时,您的下一个位置不是'1',因此您的计数停在4。

通常,您的方法就像在手指之间计算差距,给定5个手指,您会得到4个空白。

旁注:当您的数组中没有1'时,您的代码将失败。