1. 程式人生 > >【LeetCode 簡單題】82-兩整數之和

【LeetCode 簡單題】82-兩整數之和

宣告:

今天是第82道題。給定兩個陣列,編寫一個函式來計算它們的交集。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

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

正文

題目:不使用運算子 + 和 - ,計算兩整數 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:

輸入: a = 1, b = 2
輸出: 3

示例 2:

輸入: a = -2, b = 3
輸出: 1

解法1。迭代。兩個數的加法計算分為兩步,對應位相加和進位。我們平時計算時是將對應位相加和進位同時計算,其實可以保留下進位,只計算對應位相加,保留進位的位置(值)。接下來,將進位向左移動一位,將上一步的結果與移位後的進位值進行對應位相加,直到沒有進位結束。

  • &:與,同為1時才為1,表明該位需要進1,所以後面左移一位
  • ^:異或,不同時為1,相同時為0,可用於相加和,但無法記錄進位

執行用時: 24 ms, 在Sum of Two Integers的Python提交中擊敗了91.87% 的使用者

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        c = 0
        while b != 0:
            c = a & b    # 記錄進位
            a = a^b % 0x100000000    # 記錄不進位時的加和
            b = (c << 1) % 0x100000000
        return a if a < 0x7fffffff else a | (~0x100000000+1) # 這個地方不能寫成0x100000001,必須寫開
        

 解法2。遞迴。用遞迴的方法實現上述步驟,程式碼如下。

執行用時: 24 ms, 在Sum of Two Integers的Python提交中擊敗了91.87% 的使用者

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        final = self.helper(a,b)
        return final if final < 0x7fffffff else final | (0x100000000+1)

    def helper(self,a,b):
        if b == 0:
            return a
        else:
            return self.helper((a^b)%0x100000000, ((a&b)<<1)%0x100000000)

結尾