题目描述
题目链接:43. 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例1:
1 2
| 输入: num1 = "2", num2 = "3" 输出: "6"
|
示例2:
1 2
| 输入: num1 = "123", num2 = "456" 输出: "56088"
|
提示:
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成。
- num1 和 num2 都不包含任何前导零,除了数字0本身。
我的题解
方法一:模拟乘法
思路
模拟乘法计算过程,使用数组记录中间值。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public String multiply(String num1, String num2) { if ("0".equals(num1) || "0".equals(num2)) { return "0"; } int n = num1.length(), m = num2.length(); int[] r = new int[n + m]; for (int i = n - 1; i >= 0; i--) { for (int j = m - 1; j >= 0; j--) { int index = m - j - 1 + (n - i - 1); int a = num1.charAt(i) - '0'; int b = num2.charAt(j) - '0'; int sum = a * b + r[index]; r[index] = sum % 10; int c = sum / 10; r[index + 1] += c; } } StringBuilder sb = new StringBuilder(); int index = r.length - 1; while (r[index] == 0) { index--; } for (int i = index; i >= 0; i--) { sb.append(r[i]); } return sb.toString(); } }
|
结果
执行用时:3 ms, 在所有 Java 提交中击败了67.02%的用户
内存消耗:39.8 MB, 在所有 Java 提交中击败了99.65%的用户