题目
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-complement
对整数的二进制表示取反(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 < 231
解法
- 方法1: 使用自带的函数bin转化成二进制后,进行取反操作
- python
class Solution:
def findComplement(self, num: int) -> int:
num_b = bin(num)[2:]
new_b = ''
new_b = ''.join(['0' if i == '1' else '1' for i in num_b])
return int(new_b, 2)
class Solution:
def bitwiseComplement(self, n: int) -> int:
if n == 0:
return 1
mask = 1
while 1:
if n >= mask:
mask = mask * 2
else:
break
return n ^ (mask-1)
class Solution {
public:
int findComplement(int num) {
long mask = 1;
while(1)
{
if(num >= mask)
{
mask = mask * 2;
}
else
{
// return mask-1-num;
break;
}
}
return num ^ (mask-1);
}
};
复杂度分析
-
时间复杂度:O(log n) -
空间复杂度:O(1)
|