每日一题:476. 数字的补数

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

一、题目描述:

476. 数字的补数

对整数的二进制表示取反(0110)后,再转换为十进制表示,可以得到这个整数的补数。

例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。 给你一个整数 num ,输出它的补数。

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= num < 2^31

二、思路分析:

题意求整数二进制位取反,得补数,可知 正数+补数 = 全为1的二进制数 如 1010 + 0101 = 1111 即 10 + 5 =15 因此只要知道给出正数的二进制位个数,求此位数的全1结果,减去整数,则可得到补数。

求二进制位数可 以2为底求对数并向上取整,即log2(num)+1, 二进制全1数等价于十进制2^位数-1,即得到和; 再减去整数,得到补数

三、AC 代码:

class Solution {
public:
    int findComplement(int num) {
        /**
            方法2:数学方法 ————— 补数为正数取反,则相加为全1二进制数,因此可定位整数的二进制位,得和,再减去整数
            TC:O(1)
            SC:O(1)
        */
        return pow(2,(int)log2(num)+1)-1 - num;
    }
};

四、参考:

执行用时 : 2 ms , 在所有 Java 提交中击败了 9.99% 的用户 内存消耗 : 39.3 MB , 在所有 Java 提交中击败了 5.05% 的用户 - 数字的补数 - 力扣(LeetCode)

大一每日三题,用了Integer.toBinnaryString,达到了100,70 - 数字的补数 - 力扣(LeetCode)

1种解法,2个角度,2份极简代码--[476] - 数字的补数 - 力扣(LeetCode)