leetcode 868. 二进制间距

题目

20201112135012-2020-11-12-13-50-14
运行效率
QQ截图20201111232053.png

题解

lowbit(x) 是x二进制表达式中最低位1所代表的数值。即x & -x就是lowbit函数。
例如
当x=22时二进制表示10110则 22&-22既可以得到二进制数值10。
为啥呢?因为我们计算机中负数采用的补码表示。lowbit很好证明。
那我们枚举相邻两个1,取出他们位数所代表的权值相除得到的结果,再通过log对2取对数就能直接得到相邻两个1之间的间隔位数。
例如x=22 二进制10110

  • 第一次取出 last = 10(二进制)
  • 第二次取出 now = 100(二进制)
  • 两者相除取对数。log2(now / last) 就可以直接得到想间隔的距离。

shuw your code

class Solution {
public:
    int binaryGap(int n) {

        int ans = 0; 
        int last = n & -n;  // 上一个最低位 1 所代表的权值
        n -= last;
        while (n)
        {
            int t = n & -n; // 当前最低位 1 所代表的权值
            ans = max(ans, (int)(log(t/last)/log(2)));
            n -= t;
            last = t;
        }
        return ans;
    }
};

  转载请注明: Maserhe leetcode 868. 二进制间距

 上一篇
剑指 Offer 65. 不用加减乘除做加法 剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法题目 题意 就是不让用加减乘除等运算来模拟实现加法运算。 题解 异或找到不需要进位的情况。 相与找到需要进位的情况。然后左移一位模拟进位。 不停循环直到进位的值为零时,即两数异或就是两个数的
2020-11-18
下一篇 
Linux考前知识点整理 Linux考前知识点整理
星期五就该Linux考试了,太快了。整理上课时的ppt知识点。
2020-11-08
  目录