当前位置:
每日算法:字符串相乘
时间:2025-11-05 11:52:11 出处:综合阅读(143)

本文转载自微信公众号「三分钟学前端」,每日作者sisterAn。算法转载本文请联系三分钟学前端公众号。字符
给定两个以字符串形式表示的串相乘非负整数 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 本身。b2b信息网 不能使用任何标准库的字符大数类型(比如 BigInteger)或直接将输入转换为整数来处理。解法一:常规解法
从右往左遍历乘数,串相乘将乘数的每日每一位与被乘数相乘得到对应的结果,再将每次得到的算法结果累加
另外,当乘数的字符每一位与被乘数高位(非最低位)相乘的时候,注意低位补 0
let multiply = function(num1, num2) { if (num1 === "0" || num2 === "0") return "0" // 用于保存计算结果 let res = "0" // num2 逐位与 num1 相乘 for (let i = num2.length - 1; i >= 0; i--) { let carry = 0 // 保存 num2 第i位数字与 num1 相乘的结果 let temp = // 补 0 for (let j = 0; j < num2.length - 1 - i; j++) { temp+=0 } let n2 = num2.charAt(i) - 0 // num2 的第 i 位数字 n2 与 num1 相乘 for (let j = num1.length - 1; j >= 0 || carry != 0; j--) { let n1 = j < 0 ? 0 : num1.charAt(j) - 0 let product = (n1 * n2 + carry) % 10 temp += product carry = Math.floor((n1 * n2 + carry) / 10) } // 将当前结果与新计算的源码库结果求和作为新的结果 res = addStrings(res, Array.prototype.slice.call(temp).reverse().join("")) } return res } let addStrings = function(num1, num2) { let a = num1.length, b = num2.length, result = , tmp = 0 while(a || b) { a ? tmp += +num1[--a] : b ? tmp += +num2[--b] : result = tmp % 10 + result if(tmp > 9) tmp = 1 else tmp = 0 } if (tmp) result = 1 + result return result }复杂度分析:
时间复杂度:O(max(m*n , n * n)) 空间复杂度:O(m+n)解法二:竖式相乘(优化)
两个数M和N相乘的结果可以由 M 乘上 N 的每一位数的和得到 ,如下图所示:

复杂度分析:
时间复杂度:O(m * n) 空间复杂度:O(m + n)
分享到:
温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!
猜你喜欢
- 在本子上升级到了12.10。但是在update的时候遇到如下错误:正在读取软件包列表... 有错误!复制代码代码如下:原因是12.04和12.10的deb源list发生冲突,解决办法是删除该目录下的所有文件:复制代码代码如下:然后执行update命令来重新生成:复制代码代码如下:apt-get update
- 制造病毒的危险与防范(揭秘制造病毒的手段与预防方法)
- 制造病毒的危险与防范(揭秘制造病毒的手段与预防方法)
- 小米金属鼠标垫(舒适顺滑体验游戏新境界)
- i7-4720HQ(i7-4720HQ的技术特点与应用领域)
- 大神Note3高配版(全面进化,重塑智能手机使用体验)
- 艾特铭客蜘蛛侠(探索铭客蜘蛛侠系列背后的设计与创意)
- 酷派手机质量如何?解密酷派手机的品质与性能(酷派手机质量评估及用户口碑调查,让您明晰购机选择)
- 三星活塞耳机(揭秘三星活塞耳机的卓越音质与高品质设计)