[LeetCode解題攻略] 43. Multiply Strings

更新於 發佈於 閱讀時間約 4 分鐘

題目描述

給定兩個非負整數的字串 num1num2,分別表示兩個數字。要求模擬乘法運算,並返回結果字串,不能使用內建的大數處理函式(例如 Python 的 intBigInteger


範例 1

輸入: num1 = "2", num2 = "3"
輸出: "6"

範例 2

輸入: num1 = "123", num2 = "456"
輸出: "56088"

限制條件

  1. 1 <= num1.length, num2.length <= 200
  2. num1num2 只包含數字,且不包含前導零。

解題思路

關鍵概念

  1. 模擬乘法運算
    • 手動模擬紙筆計算中數字的逐位相乘。
    • 使用類似「乘法表」的方式,計算每對位數的乘積,並將結果累加在正確位置上。
  2. 處理進位
    • 當部分乘積超過 10 時,需要進位。

如何進行計算?

  1. 假設 num1 長度為 n1​,num2 長度為 n2,那麼結果最大長度為 n1+n2
  2. 使用一個數組 result 來存放每一位的計算結果。
  3. 遍歷 num1num2 的每個位數,模擬逐位相乘的過程,並將計算結果累加到 result 對應的位置。
  4. 處理進位,將結果轉為字串。

解法一:模擬逐位相乘

核心步驟

  1. 初始化一個長度為 num1.length + num2.length 的陣列 result,用來存放中間結果。
  2. 從後往前遍歷 num1num2 的每個位數,計算其乘積並加到對應位置。
  3. 處理進位,將結果陣列轉為字串。

程式碼

class Solution:
def multiply(self, num1: str, num2: str) -> str:
if num1 == "0" or num2 == "0":
return "0"

# 初始化結果數組,長度最多為 num1.length + num2.length
n1, n2 = len(num1), len(num2)
result = [0] * (n1 + n2)

# 倒序遍歷 num1 和 num2
for i in range(n1 - 1, -1, -1):
for j in range(n2 - 1, -1, -1):
# 計算對應位的乘積
mul = int(num1[i]) * int(num2[j])
# 確定累加的位置
pos1, pos2 = i + j, i + j + 1
# 加入到 result 對應位置
sum_ = mul + result[pos2]
result[pos2] = sum_ % 10 # 取餘數存當前位
result[pos1] += sum_ // 10 # 進位

# 去掉前導零,轉為字串
result_str = ''.join(map(str, result)).lstrip('0')
return result_str

時間與空間複雜度

  • 時間複雜度:O(n1×n2),其中 n1 和 n2​ 分別為 num1num2 的長度。
    每位數字需要兩層迴圈進行乘積計算。
  • 空間複雜度:O(n1+n2),用於存儲結果數組。

結論

  1. 這道題的關鍵在於熟悉數字乘法的模擬過程,並有效處理進位與結果合併。
  2. 模擬逐位相乘 是最常見的解法,時間與空間複雜度都滿足題目要求。
  3. 如果你對紙筆計算過程較為熟悉,可以嘗試進一步優化代碼結構。

希望這篇文章幫助你深入理解​這道題目的解法!


歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言
avatar-img
留言分享你的想法!

































































給定一個整數數組 height,每個元素表示一個柱子的高度,其中每個柱子的寬度為 1,請計算柱子之間可以容納多少雨水。
給定一個未排序的整數數組 nums,找出其中的最小的缺失的正整數。 必須設計一個時間複雜度為 O(n) 的解法,並且空間複雜度為 O(1) 。
給定一個可能包含重複數字的整數數組 candidates 和一個目標值 target,找出所有的唯一組合,使得這些組合中的數字和為 target。 數組中的每個數字只能在每個組合中使用一次。
給定一個無重複正整數數組 candidates 和一個目標值 target,找出所有可以使數字和為 target 的組合。 數組中的數字可以無限制重複選取,並且所有的組合需要是唯一的。
Count-and-say序列是透過遞歸公式定義的數字串序列: countAndSay(1) = "1" countAndSay(n) 是 countAndSay(n - 1) 的Run-length encoding。
編寫一個程式,求解數獨(Sudoku)問題。
給定一個整數數組 height,每個元素表示一個柱子的高度,其中每個柱子的寬度為 1,請計算柱子之間可以容納多少雨水。
給定一個未排序的整數數組 nums,找出其中的最小的缺失的正整數。 必須設計一個時間複雜度為 O(n) 的解法,並且空間複雜度為 O(1) 。
給定一個可能包含重複數字的整數數組 candidates 和一個目標值 target,找出所有的唯一組合,使得這些組合中的數字和為 target。 數組中的每個數字只能在每個組合中使用一次。
給定一個無重複正整數數組 candidates 和一個目標值 target,找出所有可以使數字和為 target 的組合。 數組中的數字可以無限制重複選取,並且所有的組合需要是唯一的。
Count-and-say序列是透過遞歸公式定義的數字串序列: countAndSay(1) = "1" countAndSay(n) 是 countAndSay(n - 1) 的Run-length encoding。
編寫一個程式,求解數獨(Sudoku)問題。
你可能也想看
Google News 追蹤
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個輸入字串word1, word2,要求我們依照word1,word2,word1,word2, ... 交叉前進的方式,合併兩個字串,作為輸出。 題目的原文敘述 測試範例 Example 1: Input: word1 = "abc", word2 = "pq
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
分享一道數學證明題 題目是將1~10的正整數分成兩組,分別為A組、B組 其中A組數字由小到大排列,B組數字則是由大到小排列,試求兩兩相減的絕對值總和
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個輸入字串word1, word2,要求我們依照word1,word2,word1,word2, ... 交叉前進的方式,合併兩個字串,作為輸出。 題目的原文敘述 測試範例 Example 1: Input: word1 = "abc", word2 = "pq
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
分享一道數學證明題 題目是將1~10的正整數分成兩組,分別為A組、B組 其中A組數字由小到大排列,B組數字則是由大到小排列,試求兩兩相減的絕對值總和