入门力扣自学笔记12 C++ (题目编号868)

​​​​​868. 二进制间距

题目:

给定一个正整数 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 = 9
10^8 = 900000000;
e表示10,e后面的数字表示次方,e的多少次方。

其实这里就是为了将pos的初值定为无穷大。


版权声明:本文为DK_Sorhic原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。