【刷题日记】43. 字符串相乘

43. 字符串相乘

其实就是大数乘法题,这道题用草稿纸演练一下,其实很好找到方法,模拟大数乘法即可。需要注意的是+进位和迭代值,还有注意向下取整和去除前导0(容易遗漏)。去除前导0的时候还要注意如果全是0,除完了的情况下要手动赋值答案为‘0’。

讲一下这道题的思路:

1.初始化:创建一个长度为 len1 + len2 的数组 pos(x位数*y位数最多等于x+y位数)用于存储每一位的乘积结果,为了方便加减,设置每一个位置的初始值为 0。

2.乘法逻辑:我们可以倒序,也可以直接按照数字来倒序遍历,将当前位字符转换为数字 n1n2。【通过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';
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值