LeetCode 415. 字串相加 | Python
阿新 • • 發佈:2020-08-03
415. 字串相加
題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/add-strings
題目
給定兩個字串形式的非負整數 num1 和num2 ,計算它們的和。
注意:
- num1 和num2 的長度都小於 5100.
- num1 和num2 都只包含數字 0-9.
- num1 和num2 都不包含任何前導零。
- 你不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字串轉換為整數形式。
解題思路
思路:雙指標,模擬
在這裡,先說明一下,題目中注意部分的最後一個,不能直接將輸入的字串轉換為整數,這裡說的是不能將整個字串轉換之後進行計算,並非說完全不能使用型別轉換。
在這裡,使用雙指標的方法,然後模擬加法運算,具體的做法及注意如下:
- 定義雙指標 p、q,分別指向
num1
,num2
末尾; - 定義變數 carry,用以儲存進位;
- 開始模擬計算(注意要加上進位),這裡相加結果當大於 10 時,將結果模 10,然後再將此時的取模結果新增到 ans 頭部;
- 因為 num1 和 num2 的長度可能不等,那麼就有可能出現索引溢位的情況。當出現這種情況時,要將較短的字串前面新增 0,用以後續的計算。
- 迴圈計算直至結束,這裡要注意進位 carry 是否不為 0,當 carry 為 1 的情況下,也要將 1 新增到 ans 頭部。
演算法的實現過程圖解如下:
具體的程式碼實現如下。
程式碼實現
class Solution: def addStrings(self, num1: str, num2: str) -> str: # 用以儲存計算結果 ans = "" # 定義指標分別指向 num1, num2 末尾 p = len(num1) - 1 q = len(num2) - 1 # 儲存進位 carry = 0 # 模擬加法運算 # 這裡將 carry 放到條件中,是考慮後續計算結束後,還有進位,也就是 carry 為 1 的情況 while p >= 0 or q >= 0 or carry: # 由於有可能出現索引溢位的現象, # 當較短的字串索引溢位時,要在頭部新增 0,用以後續計算 elem1 = int(num1[p]) if p >= 0 else 0 elem2 = int(num2[q]) if q >= 0 else 0 # 模擬計算,注意加上進位 tmp = elem1 + elem2 + carry # 相加結果可能大於 10 # 計算進位,並且就將結果模 10,餘數新增到 ans 頭部 carry = tmp // 10 ans = str(tmp % 10) + ans # 往前繼續計算 p -= 1 q -= 1 return ans
實現結果
歡迎關注
公眾號 【書所集錄】