给定一个正整数 N
,找到并返回 N
的二进制表示中两个连续的 1 之间的最长距离。
如果没有两个连续的 1,返回 0
。
示例 1:
输入:22 输出:2 解释: 22 的二进制是 0b10110 。 在 22 的二进制表示中,有三个 1,组成两对连续的 1 。 第一对连续的 1 中,两个 1 之间的距离为 2 。 第二对连续的 1 中,两个 1 之间的距离为 1 。 答案取两个距离之中最大的,也就是 2 。
示例 2:
输入:5 输出:2 解释: 5 的二进制是 0b101 。
示例 3:
输入:6 输出:1 解释: 6 的二进制是 0b110 。
思路:这道题是比较简单的题目,我们只需要将数字转为二进制,然后记录里面1的最大距离。
int binaryGap(int N) { string s; for(int a = N; a ;a = a/2) { s=s+(a%2?'1':'0'); } reverse(s.begin(),s.end()); int gap=0,flag=0,max=0; for(int i=0;i<s.size();i++) { if(s[i]=='1' || flag==1) { if(flag==1) { gap++; if(s[i]=='1') { flag=0; max=max>gap?max:gap; gap=0; } } if(s[i]=='1' && flag==0) flag=1; } } return max; }
上述方法比较繁琐。是用一个flag作为标志,来判断是第一个还是第二个。下面是比较简单的方法
是通过记录上一个1出现的位置pre,只需要用当前的i减去pre,就是这两个1的距离,这样就不用判断是第1个还是第2个了,并且还可以连续判断
int binaryGap(int N) { string s; for(int a = N; a ;a = a/2) { s=s+(a%2?'1':'0'); } reverse(s.begin(),s.end()); int gap=0,pre=-1; for(int i=0;i<s.size();i++) { if(s[i]=='1') { if(pre>=0) gap=max(gap,i-pre); pre=i; } } return gap; }