1. 程式人生 > 其它 >【數學】力扣415:字串相加

【數學】力扣415:字串相加

給定兩個字串形式的非負整數 num1 和num2 ,計算它們的和並同樣以字串形式返回。
你不能使用任何內建的用於處理大整數的庫(比如 BigInteger), 也不能直接將輸入的字串轉換為整數形式。
示例:

輸入:num1 = "11", num2 = "123"
輸出:"134"

演算法流程: 設定 i,j 兩指標分別指向 num1,num2 尾部,模擬豎式加法

  1. 計算進位:定義一個變數 carry 維護當前是否有進位,然後從末尾到開頭逐位相加。計算 carry = sum // 10,代表當前位相加是否產生進位;
  2. 添加當前位:計算 result = x + y + carry,並將當前位 result % 10 新增至 res 頭部;
  3. 索引溢位處理:當指標 i 或 j 走過數字首部後,給 x,y 賦值為 0,相當於給 num1,num2 中長度較短的數字前面填 0,以便後續計算。
  4. 當遍歷完 num1,num2 後跳出迴圈,並根據 carry 值決定是否在頭部新增進位 1,最終返回 res 即可。
class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        # 定義兩個指標分別指向兩個字串的尾部,定義carry變量表示進位數(值為0或1),初始化結果字串
        i, j, carry, res = len(num1) - 1, len(num2) - 1, 0, ""
        while i >= 0 or j >= 0: # 是or不是and,只要有一個字串的索引還沒為負,就繼續計算
            # 將指標指向的字串轉化為數字,else是考慮索引溢位情況
            x = int(num1[i]) if i >= 0 else 0
            y = int(num2[j]) if j >= 0 else 0
            # 開始豎式加法
            result = x + y + carry # 先算這一列的結果
            carry = result // 10 # 再看是否進位,為下一位計算做準備
            res = str(result % 10) + res # 整個計算結果的字串,注意要將數字轉化為字串
            i, j = i - 1, j - 1 # 指標移動到下一位繼續迴圈
        return "1" + res if carry == 1 else res

時間複雜度:O(max(len 1, len 2))。豎式加法的次數取決於較大數的位數。
空間複雜度:O(1)。除答案外只需要常數空間存放若干變數。