43. 字符串相乘
其实就是大数乘法题,这道题用草稿纸演练一下,其实很好找到方法,模拟大数乘法即可。需要注意的是+进位和迭代值,还有注意向下取整和去除前导0(容易遗漏)。去除前导0的时候还要注意如果全是0,除完了的情况下要手动赋值答案为‘0’。
讲一下这道题的思路:
1.初始化:创建一个长度为 len1 + len2
的数组 pos(x位数*y位数最多等于x+y位数)
,用于存储每一位的乘积结果,为了方便加减,设置每一个位置的初始值为 0。
2.乘法逻辑:我们可以倒序,也可以直接按照数字来倒序遍历,将当前位字符转换为数字 n1
和 n2
。【通过n1=+num[i]这样子赋值将其转化为数字】
3.累加结果:计算当前位置的总和 sum
,即当前位乘积加上之前存储的值 pos[i + j + 1]
。更新结果数组:
pos[i + j + 1] = sum % 10
:存储当前位的值pos[i + j] += Math.floor(sum / 10)
:将进位加到前一位
4.处理前导零:在完成所有乘法后,可能会在 pos
数组的最前面出现前导零。通过 while
循环去除这些零。【一直判断pos【0】是否为0,如果是则shift出去。】
pos.shift()
方法用于移除数组的第一个元素。如果pos
数组不为空,使用pos.join('')
将数组转为字符串并返回。
5.最后返回结果,注意要判断答案的长度,如果 pos
数组为空,返回 ‘0’,否则转为字符串返回。
代码:
//大数乘法
var multiply = function (num1, num2) {
const len1 = num1.length;
const len2 = num2.length;
const pos = new Array(len1 + len2).fill(0);
for (let i = len1 - 1; i >= 0; i--) {
const n1 = +num1[i];//将 num1[i] 的值转换为一个数字
for (let j = len2 - 1; j >= 0; j--) {
const n2 = +num2[j];
const multi = n1 * n2;
const sum = multi + pos[i + j + 1];//注意要加上pos[i+j+1]
pos[i + j + 1] = sum % 10;//本位
pos[i + j] += Math.floor(sum / 10);//增位,记得向下取整数,注意是+=,要加上之前的值迭代
}
}
//除掉前导零
while (pos[0] == 0) {
pos.shift();
}
return pos.length ? pos.join('') : '0';
};