43. Multiply Strings
題目網址:https://leetcode.cn/problems/multiply-strings/
題意:給兩個以 string 表示的非負整數
num1
和num2
, 返回num1
和num2
的乘積 (以 string 表示)。注意:不得使用任何內建的 BigInteger library 或是 直接將 input string 轉換為整數。
Solution:
想法:利用大數乘法, 用整數 array
digits
來儲存乘積e.g.
num1 = "123"
,num2 = "45"
- 令每個數最左邊的數
idx = 0
, 每往右一位idx + 1
,digits
最左邊的 idx 也為 0
num1
中2
的idx = 1
num2
中4
的idx = 0
- 若
num1.size() = m
,num2.size() = n
, 則digits.size() = m + n
- 若
num1
和num2
都取最小值, 則num1
為 $10^{m-1}$,num2
為 $10^{n-1}$
➔num1 x num2
為 $10^{m + n - 2}$, 因此乘積的長度 =m + n - 1
- 若
num1
和num2
都取最大值, 則num1
為 $10^m-1$,num2
為 $10^n-1$
➔num1 x num2
為 $10^{m + n} - 10^m - 10^n + 1$
➔ $10^{m + n - 1}$ < 乘積 < $10^{m + n}$, 因此乘積的長度 =m + n
- 由上述得知
num1 x num2
的長度最多為m + n
num1
中2
的idx = 1
, 和num2
中4
的idx = 0
, 計算出來的08
會在digits
的 index 為[i + j, i + j + 1]
的區間- 計算
digits
是先計算idx = i + j + 1
, 因為i + j + 1
較靠右 (平時我們做乘法加總時的順序), 然後才讓靠左的i + j
加總carry
- 下圖
123 x 45
會得出digits
為05535
- 要先去掉左邊開頭為 0 的部分 (leading zero)
- 再把剩餘的部分轉成 string, 得到
5535
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m + n)$ ➔
digits
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論