给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。
如果没有两个连续的 1,返回 0 。
示例 1:
输入:22
输出:2
解释:
22 的二进制是 0b10110 。
在 22 的二进制表示中,有三个 1,组成两对连续的 1 。
第一对连续的 1 中,两个 1 之间的距离为 2 。
第二对连续的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
输出:2
解释:
22 的二进制是 0b10110 。
在 22 的二进制表示中,有三个 1,组成两对连续的 1 。
第一对连续的 1 中,两个 1 之间的距离为 2 。
第二对连续的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
示例 2:
输入:5
输出:2
解释:
5 的二进制是 0b101 。
输出:2
解释:
5 的二进制是 0b101 。
示例 3:
输入:6
输出:1
解释:
6 的二进制是 0b110 。
输出:1
解释:
6 的二进制是 0b110 。
示例 4:
输入:8
输出:0
解释:
8 的二进制是 0b1000 。
在 8 的二进制表示中没有连续的 1,所以返回 0 。
输出:0
解释:
8 的二进制是 0b1000 。
在 8 的二进制表示中没有连续的 1,所以返回 0 。
提示:
1 <= N <= 10^9
思路:一遍遍历,用一个 max 表示遍历过程中的最大距离,运用位运算从右向左检查低位,如果 (N & 1) != 0 就说明低位是1,则更新distance距离为0,把当前作为第一个一,同时更新当前max,话不多说 看代码。
1 int binaryGap(int N) 2 { 3 int distance = 0, max = 0, distanceon = 0; 4 5 while(N > 0) 6 { 7 if((N & 1) != 0) //如果碰到1就更新distance的值 碰到0就直接加一 8 { 9 distanceon = 1; 10 if(distance > max) 11 { 12 max = distance; 13 } 14 distance = 0; 15 } 16 distance += distanceon; 17 N = N >> 1; 18 } 19 return max; 20 }
按位与运算符 ‘&’,是对比二进制数的每一位数,如果是1则结果为1,否则都为0;
例如:00011011
00001001
结果:00001001