题目:
给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。
如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。
示例 1:
输入:n = 22
输出:2
解释:22 的二进制是 "10110" 。
在 22 的二进制表示中,有三个 1,组成两对相邻的 1 。
第一对相邻的 1 中,两个 1 之间的距离为 2 。
第二对相邻的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
示例 2:
输入:n = 8
输出:0
解释:8 的二进制是 "1000" 。
在 8 的二进制表示中没有相邻的两个 1,所以返回 0 。
示例 3:
输入:n = 5
输出:2
解释:5 的二进制是 "101" 。
提示:
1 <= n <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-gap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
首先,要定义三个变量,第一个为了记录1现在的位置,第二个为了去找后序的1的位置,第三个是最终的答案。
其次,让n和1进行位运算,只要是1那么将ans与现在位置减去原来位置的数值相对比,取最大值,完后更新1现在位置的变量ans。
最后,将每一次n都向右移动一位,对目标数n进行循环即可。
代码:
class Solution {
public:
int binaryGap(int n) {
int pos = 1e9;
int r = 0;
int ans = 0;
while(n > 0)
{
if(n & 1)
{
ans = max(ans,r-pos);
pos = r;
}
n >>= 1;
++r;
}
return ans;
}
};
注:
1.int pos = 1e9;
1e9通常来说这是计算机中一种科学计数法的表示形式:
1e9 = 110^9 = 1000000000;
例如:9e8 = 910^8 = 900000000;
e表示10,e后面的数字表示次方,e的多少次方。
其实这里就是为了将pos的初值定为无穷大。