开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
476.数字的补数
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/nu…
对整数的二进制表示取反(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: 使用自带的函数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) # 转换为10进制
-
方法2:位运算,原数 补数有一定的关系,二者之和恰好是位数的全1二进制
-
python
class Solution:
def bitwiseComplement(self, n: int) -> int:
if n == 0:
return 1
mask = 1
while 1:
if n >= mask:
mask = mask * 2
else:
# return mask - n - 1
break
return n ^ (mask-1)
- c++
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)