1. 程式人生 > 實用技巧 >LeetCode 415. 字串相加 | Python

LeetCode 415. 字串相加 | Python

415. 字串相加


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/add-strings

題目


給定兩個字串形式的非負整數 num1 和num2 ,計算它們的和。

注意:

  • num1 和num2 的長度都小於 5100.
  • num1 和num2 都只包含數字 0-9.
  • num1 和num2 都不包含任何前導零。
  • 你不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字串轉換為整數形式。

解題思路


思路:雙指標,模擬

在這裡,先說明一下,題目中注意部分的最後一個,不能直接將輸入的字串轉換為整數,這裡說的是不能將整個字串轉換之後進行計算,並非說完全不能使用型別轉換。

在這裡,使用雙指標的方法,然後模擬加法運算,具體的做法及注意如下:

  • 定義雙指標 p、q,分別指向 num1num2 末尾;
  • 定義變數 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

實現結果


歡迎關注


公眾號 【書所集錄