要求
对整数的二进制表示取反(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 。
核心代码
class Solution:
def findComplement(self, num: int) -> int:
binary = list()
while num >= 2:
temp = num % 2
binary.append(temp)
num = (num- temp) // 2
binary.append(num)
res = 0
multiplex = 1
for item in binary:
res += (1-item) * multiplex
multiplex *= 2
return res
另一种解法
class Solution:
def findComplement(self, num: int) -> int:
res = 0
pos = 0
while num >= 2:
temp = num % 2
if not temp:
res += 2 ** pos
num //= 2
pos += 1
return res
第三种解法
class Solution:
def findComplement(self, num: int) -> int:
s = bin(num)[2:]
b = ""
for ch in s:
if ch == "0":
b+= "1"
else:
b += "0"
return int(b,2)
解题思路:第一种解法:我们先将这个十进制的数字通过取余的方式转换成二进制,然后我们将他进行按位取反,在将取反后的数字变成十进制,主要是取余变换进制的操作和累乘换成10进制的操作需要学习;第二种解法(高效):我们将一个数字取反,原本的位置是1,取反变成0,在还原成十进制的时候没用,可以直接不进行计算,所以我们只关注0的位置,取余的时候得到的二进制是从后向前的,我们使用pos记录得到0的位置,在该位置乘数是2 ** pos,所以比较高效的得到了取反后的数字;第三种解法:我们使用bin和int的方式将完成二进制和十进制的转换,比较简单。