【LeetCode 簡單題】82-兩整數之和
阿新 • • 發佈:2018-12-20
宣告:
今天是第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)