题目描述:【腾讯精选练习(50 题)】
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解题思路:
两个字符串位数从右往左数,第一个数的第i位与第二个数的第j位相乘,会影响乘积的第i+j和第i+j-1位。单独求出结果乘积中的每一位,拼接为字符串即为最终结果。
解题代码:
class Solution {
public String multiply(String num1, String num2) { // "123" "456"
if ("0".equals(num1) || "0".equals(num2))
return "0";
int len1 = num1.length(), len2 = num2.length();
int A[] = new int[len1 + len2];
for (int i = len1 - 1; i >= 0; i--) {
for (int j = len2 - 1; j >= 0; j--) {
// A[3 + 3 - 2 - 2 - 2] += 3 * 6; // A[0] += 18;
// A[3 + 3 - 2 - 2 - 1] += 3 * 5; // A[1] += 15;
// A[3 + 3 - 2 - 2 - 0] += 3 * 4; // A[2] += 12;
// A[3 + 3 - 2 - 1 - 2] += 2 * 6; // A[1] += 12;
// A[3 + 3 - 2 - 1 - 1] += 2 * 5; // A[2] += 10;
// A[3 + 3 - 2 - 1 - 0] += 2 * 4; // A[3] += 8;
// A[3 + 3 - 2 - 0 - 2] += 1 * 6; // A[2] += 6;
// A[3 + 3 - 2 - 0 - 1] += 1 * 5; // A[3] += 5;
// A[3 + 3 - 2 - 0 - 0] += 1 * 4; // A[4] += 4;
A[len1 + len2 - 2 - i - j] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}
// [18, 27, 28, 13, 4, 0]
System.out.println(Arrays.toString(A));
String result = "";
for (int i = 0; i < len1 + len2; i++) {
int div = A[i] / 10;
int mod = A[i] % 10;
if (div > 0) {
A[i + 1] += div;
}
A[i] = mod;
result = (char) (A[i] + '0') + result;
}
// 移除字符串前面的0
return result.replaceAll("^(0+)", "");
}
}