美文网首页LeetCode
476. 数字的补数

476. 数字的补数

作者: 闭门造折 | 来源:发表于2018-11-07 18:12 被阅读14次

    给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

    注意:

    给定的整数保证在32位带符号整数的范围内。
    你可以假定二进制数不包含前导零位。

    示例 1:

    输入: 5
    输出: 2
    解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。

    示例 2:

    输入: 1
    输出: 0
    解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。

    思路

    先将数字取反,取反后的数字,可能前面会增加很多1,这不是我们需要的
    问题转变为如何将32位数字左起的n个1消去
    遍历找到左起第一个0的位置,使用异或操作,将最左边连续的1删去

    性能分析

    时间复杂度为O(bit(N)),由于这道题N是INT范围,所以其实是O(32) ~ O(1)
    空间复杂度为O(1)

    具体代码

    class Solution {
    public:
        int findComplement(int num) {
            if(!num){ //0取反为1
                return 1;
            }
            //整体取反,此时前方可能补很多1
            num = ~num; 
            //找到左起第一个0的位置
            int count = 31; 
            while((num >> count) % 2){
                count--;
            }
            // 与形如 1111110xxxxxxx的数做异或操作,将num前方多出的1消去
            int rule = 0xFFFFFFFF << (count + 1);
            return num ^ rule;
        }
    };
    

    相关文章

      网友评论

        本文标题:476. 数字的补数

        本文链接:https://www.haomeiwen.com/subject/ubzvxqtx.html