Multiply Strings
假设两个数字表示为字符串,则将数字作为字符串返回乘法。
注意:数字可以任意大,也可以是非负数。
这是我的代码,我知道这不是解决这个问题的最佳方法,但我对空间复杂度有疑问,对于res,我知道长度将是M + N,但对于StringBuilder tmp,长度是M并且有N个循环,每个循环我创建一个长度为M的新StringBuilder。所以我感到困惑,请帮助我,谢谢你们,伙计们。
public class Solution {
// extra space: O(M + N) maybe O(M * N), 354ms
public String multiply(String num1, String num2) {
int N = num1.length(), M = num2.length();
StringBuilder res = new StringBuilder();
for (int i = 0; i < N; i++) { // num1
StringBuilder tmp = new StringBuilder(M); // main confusion, the length is M, and N loops
int carry = 0;
if (num1.charAt(i) == '0') { // if the current digit is 0, then continue
res.append(0);
continue;
}
for (int j = M - 1; j >= 0; j--) { // num2
carry += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
tmp.append(carry % 10);
carry /= 10;
}
if (carry != 0) tmp.append(carry); // case: 9 * 9
tmp = tmp.reverse();
res = res.append(0);
// add all the products
for (int k = res.length() - 1, l = tmp.length() - 1, add = 0; l >= 0 || add > 0; k--, l--) {
add += ((k >= 0) ? res.charAt(k) - '0' : 0) + ((l >= 0) ? tmp.charAt(l) - '0': 0);
if (k >= 0)
res.setCharAt(k, (char) ('0' + (add % 10)));
else
res.insert(0, add % 10);
add /= 10;
}
}
int r = 0;
for ( ; r < res.length() - 1 && res.charAt(r) == '0'; r++); // 0 * 0
return res.substring(r).toString();
}
}