1.題目描述
給定一個正整數,輸出它的補數。補數是對該數的二進制表示取反。
注意:
給定的整數保證在32位帶符號整數的範圍內。
你可以假定二進制數不包含前導零位。
示例 1:
輸入: 5
輸出: 2
解釋: 5的二進制表示爲101(沒有前導零位),其補數爲010。所以你需要輸出2。
示例 2:
輸入: 1
輸出: 0
解釋: 1的二進制表示爲1(沒有前導零位),其補數爲0。所以你需要輸出0。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-complement
2.python求解
我的思路1,輸入5,5對應的二進制是101,與全1的111異或就得到010,就是2啦,
引用其他人提交的結果,我覺得這個左移移的很耐斯呀
class Solution(object):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
length = len(bin(num))-2 #二進制位數的長度
n = (1 << length) - 1 #將1左移length位,並減1得到二進制數位全是1的長度位length的數
return n ^ num #異或
作者:li-xian-sen
鏈接:https://leetcode-cn.com/problems/two-sum/solution/yi-huo-by-li-xian-sen/
來源:力扣(LeetCode)
我的思路2,輸入5,5對應的二進制是101,1逐位減,得到010,然後用2的多少次冪,求整數
class Solution(object):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
num_bin = bin(num)
num_bin = num_bin[2:len(num_bin)]
sum = 0
for i in range(len(num_bin)):
sum += (1-int(num_bin[i]))*pow(2,len(num_bin)-i-1)
return sum