给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
- 给定的整数保证在32位带符号整数的范围内。
- 你可以假定二进制数不包含前导零位。
示例 1:
输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。
示例 2:
输入: 1
输出: 0
解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。
第一种思路:
先用一个数组存正整数的二进制,然后扫描这个数组,每一位取反并算出最后对应的十进制数。
class Solution(object):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
binary = list()
while(num >= 2):
temp = num % 2
binary.append(temp)
num = (num-temp) / 2
binary.append(num)
# print binary
res = 0
multiplex = 1
for item in binary:
res += (1-item) * multiplex
multiplex *= 2
return res
第二种思路:
在将正整数处理为二进制的过程中,如果某一位是0,那么结果就直接加上 2** pos,pos是当前的位置,
这样处理完二进制之后即可直接得到答案。
class Solution(object):
def findComplement(self, num):
"""
:type num: int
:rtype: 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(object):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
s = bin(num)[2:]
b = ""
for ch in s:
if ch == "0":
b += "1"
else:
b += "0"
# print b
return int(b,2)