题目描述
题解
从低位往高位乘,进位累加到下一个高位,这个点肯定都能想到。问题在于如何存这样的状态。
其实很简单,num1假设有n位,num2假设有m位,那么num1和num2的运算结果分解到n + m位来处理就行了。我们先取num1的低位,然后遍历num2从低到高每一位,与num1的低位相乘,得到的结果按照对应的位,存入n+m的列表中(有进位就处理进位),相当于数字按位分解相乘。
比如123 * 456 = 123 * (6 + 50 + 400),我们有:
1)6 * 123 = 738
2)50 * 123 = 6150
3)400 * 123 = 49200
4)123 * 456 = 738 + 6150 + 49200 = 56088
我们用计算器验证一下:
执行用时:3 ms , 在所有 Java 提交中击败了78.62%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了54.62%的用户
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0"))
return "0";
int[] resList = new int[num1.length() + num2.length()];
for (int i = num1.length() - 1; i >= 0; i--) {
int num1int = num1.charAt(i) - '0';
for (int j = num2.length() - 1; j >= 0; j--) {
int num2int = num2.charAt(j) - '0';
int product = resList[i + j + 1] + num1int * num2int;
resList[i + j + 1] = product % 10;
resList[i + j] += product / 10;
}
}
// int[] 存入String
StringBuilder res = new StringBuilder();
boolean meetzero = false;
for (int n : resList) {
if (n != 0) {
meetzero = true;
}
if (!meetzero) continue;
res.append(n);
}
return res.toString();
}
}