1. 程式人生 > >【LeetCode 簡單題】110-數字的補數

【LeetCode 簡單題】110-數字的補數

宣告:

今天是第110道題。給定一個正整數,輸出它的補數,補數是對該數的二進位制表示取反。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個正整數,輸出它的補數。補數是對該數的二進位制表示取反。

注意:

  1. 給定的整數保證在32位帶符號整數的範圍內。
  2. 你可以假定二進位制數不包含前導零位。

示例 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