开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
一、题目描述:
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
例如,整数 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;
}
};
四、参考:
大一每日三题,用了Integer.toBinnaryString,达到了100,70 - 数字的补数 - 力扣(LeetCode)