题目描述:给你一个正整数,求这个正整数的二进数的值,全部取反后的整数的值。
- 这个正整数是一个小于32位的整数
- 你可以认为这个二进制数没有前导0,也就是说二进制数的第一位一定是1
这道题就没啥说的了,将给的正整数转化为二进制数,取反后再转化为整数,返回结果就ok。
我的代码(很渣):
class Solution(object):
def findComplement(self, num):
f = []
for l in list(bin(num).replace("0b", "")):
if l == '1':
f.append('0')
else:
f.append('1')
return int(''.join(f), 2)
这里再介绍一种很简洁的办法。
我大致讲解一下思路:
- 当i<=num时,i左移一位
- 用i-1的值与num异或去的结果
举例:
假设num=5(二进制:101)
当i=1(二进制:1)时,i<=num,此时i左移一位,i=2
当i=2(二进制:10)时,i<=num, i继续左移一位, i=4
当i=4(二进数:100)时,i<=num, i继续左移一位,i=8
当i=8(二进制数:1000)时,i>num, 此时i-1,即7(二进制:111)
此时7(111)与5(101)异或,结果为2(010)
所以最终的结果是2
class Solution(object):
def findComplement(self, num):
i = 1
while i <= num:
i = i << 1
return (i - 1) ^ num
这道题的做法多种多样,但我觉得能过使用位运算来做出结果是一个非常好的方式。
推荐大家在做题的时候可以多想想怎么使用位运算来解决问题。
以上。