🌕🌗 43. 字符串相乘
2022年10月10日
- algorithm
🌕🌗 43. 字符串相乘
难度: 🌕🌗
问题描述
解法
class Solution {
public String multiply(String num1, String num2) {
// 思路:
// 根据乘法计算步骤,进行表达
int m = num1.length();
int n = num2.length();
// 特殊情况特判
if(m == 1 && num1.equals("0")) {
return "0";
}
if(n == 1 && num2.equals("0")) {
return "0";
}
int[] array = new int[m + n]; // 结果的最大位数不超过这么多
for(int j = n - 1; j >= 0; j --) {
int base = j; // 当轮的基地址
int c = 0; // 进位
for(int i = m - 1; i >= 0; i --) {
int offset = i + 1; // 当轮的偏移量
// 当轮的 num1 每一位均需要与 num2[j] 相乘,从低位开始依次相乘
int a = num1.charAt(i) - '0';
int b = num2.charAt(j) - '0';
int mul = a * b + c;
mul += array[base + offset]; // 加上前面几轮在该位产生的结果
// System.out.println(base + ":" + offset + " " + mul);
c = mul / 10; // 新的进位
mul = mul % 10;
array[base + offset] = mul;
array[base + offset - 1] += c; // 前面一位加上当前的进位
c = 0;
// System.out.println(base + " " + Arrays.toString(array));
}
array[base] += c;
}
// System.out.println(Arrays.toString(array));
// 从后往前遍历数组,得到 res
StringBuilder sb = new StringBuilder();
for(int i = m + n - 1; i >= 0; i --) {
if(array[i] < 10) {
sb.append(array[i]);
} else {
array[i - 1] += array[i] / 10;
sb.append(array[i] % 10);
}
}
String res = sb.reverse().toString();
// 除去可能存在的前导 0
for(int i = 0; i < m + n; i ++) {
if(res.charAt(i) != '0') {
return res.substring(i, m + n);
}
}
return res;
}
}