解題說明
Add Strings
題目描述:給定兩個以字串表示的非負整數 num1 和 num2,回傳它們的和(同樣以字串表示)。不能將輸入直接轉換成整數(不能用 stoi、stoll、BigInteger 等)。
解題思路:模擬手動加法:從兩個字串的末位(個位數)開始,逐位相加並記錄進位 carry。用兩個指標 i、j 分別從 num1、num2 尾端往頭走,每次取出對應數字(若指標已超出範圍則取 0),計算 sum = d1 + d2 + carry,將 sum % 10 加入結果,carry = sum / 10。最後若 carry != 0 再補一位。結果字串需反轉。
C++ 解法
複雜度分析
時間複雜度:O(max(m, n)) — m、n 為兩字串長度,逐位遍歷一次。
空間複雜度:O(max(m, n)) — 結果字串長度最多為 max(m, n) + 1。
虛擬碼
1. Set i = num1.size()-1, j = num2.size()-1, carry = 0 2. While i >= 0 or j >= 0 or carry != 0: a. d1 = num1[i--] - '0' if i >= 0, else 0 b. d2 = num2[j--] - '0' if j >= 0, else 0 c. sum = d1 + d2 + carry d. Append (sum % 10) as char to result e. carry = sum / 10 3. Reverse result string 4. Return result
其他解法
使用 stringstream 或 string 前插:每次將新 digit 插入字串頭部(result.insert(0, ...)),可省略最後的 reverse,但前插操作本身是 O(n),整體複雜度變 O(n²),不建議。
先補齊再相加:在較短的字串前補 '0' 至兩者等長,然後從右到左統一處理,邏輯略簡單但需額外空間。
延伸思考
- 若要擴展為兩個浮點數字串相加(有小數點),邏輯上需要哪些調整?
- 如何實作字串表示的大數相乘(Multiply Strings,LC 43)?
- 這個解法能否直接用於處理負數?如果不行,需要增加什麼邏輯?