【LeetCode 簡單題】110-數字的補數
阿新 • • 發佈:2018-11-27
宣告:
今天是第110道題。給定一個正整數,輸出它的補數,補數是對該數的二進位制表示取反。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:給定一個正整數,輸出它的補數。補數是對該數的二進位制表示取反。
注意:
- 給定的整數保證在32位帶符號整數的範圍內。
- 你可以假定二進位制數不包含前導零位。
示例 1:
輸入: 5 輸出: 2 解釋: 5的二進位制表示為101(沒有前導零位),其補數為010。所以你需要輸出2。示例 2:
輸入: 1 輸出: 0 解釋: 1的二進位制表示為1(沒有前導零位),其補數為0。所以你需要輸出0。
解法1。將num轉為二進位制後遍歷其每一位,取反後輸出到一個新的列表rev裡,再連線成字串,返回其int的強制轉換結果,程式碼如下。
執行用時: 24 ms, 在Number Complement的Python提交中擊敗了99.52% 的使用者
class Solution(object): def findComplement(self, num): """ :type num: int :rtype: int """ rev = ['1' if i == '0' else '0' for i in bin(nums)[2:]] rev = ''.join(rev) return int(rev,2)
解法2。這種思路是利用與1逐位異或的效果等同於取非,其實把過程寫出來非常得明瞭,當i左移到大於等於num的位數時就表示任務結束,num所有位的取非已經完成,程式碼如下。
執行用時: 24 ms, 在Number Complement的Python提交中擊敗了99.52% 的使用者
class Solution(object): def findComplement(self, num): """ :type num: int :rtype: int """ i = 1 while i <= num: num ^= 1 i <<= 1 # 左移,高位丟棄,低位補0 return num
結尾
解法1:原創
解法2:https://blog.csdn.net/ThrallOtaku/article/details/80437402