每日算法:字符串相乘

  发布时间:2025-11-05 08:49:06   作者:玩站小弟   我要评论
本文转载自微信公众号「三分钟学前端」,作者sisterAn。转载本文请联系三分钟学前端公众号。给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘 。

本文转载自微信公众号「三分钟学前端」,每日作者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 本身。香港云服务器 不能使用任何标准库的字符大数类型(比如 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)         }         // 将当前结果与新计算的b2b供应网结果求和作为新的结果         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 的每一位数的和得到 ,如下图所示:

计算 num1 依次乘上 num2 的每一位的和 把得到的所有和按对应的位置累加在一起,就可以得到 num1 * num2 的结果 let multiply = function(num1, num2) {     if(num1 === 0 || num2 === 0) return "0"     // 用于保存计算结果     let res = []     // 从个位数开始逐位相乘     for(let i = 0 ; i < num1.length; i++){         // num1 尾元素         let tmp1 = +num1[num1.length-1-i]         for(let j = 0; j < num2.length; j++){             // num2尾元素             let tmp2 = +num2[num2.length-1-j]             // 判断结果集索引位置是否有值             let pos = res[i+j] ? res[i+j]+tmp1*tmp2 : tmp1*tmp2             // 赋值给当前索引位置             res[i+j] = pos%10             // 是否进位 这样简化res去除不必要的云服务器提供商"0"             pos >=10 && (res[i+j+1]=res[i+j+1] ? res[i+j+1]+Math.floor(pos/10) : Math.floor(pos/10));         }     }     return res.reverse().join(""); } 

复杂度分析:

时间复杂度:O(m * n) 空间复杂度:O(m + n)
  • Tag:

相关文章

  • 华为电脑账户信息格式错误的解决方法(解决华为电脑账户信息格式错误的实用技巧)

    摘要:随着数字化时代的到来,我们越来越多地使用电脑账户进行各种操作。然而,有时候我们可能会遇到华为电脑账户信息格式错误的问题。这篇文章将为大家介绍解决这一问题的实用技巧。一了解华...
    2025-11-05
  • 月均活跃用户达1.3亿,B站高可用架构实践

    流量洪峰下要做好高服务质量的架构是一件具备挑战的事情,本文详细阐述了从 Google SRE 的系统方法论以及实际业务的应对过程中出发,一些体系化的可用性设计。对我们了解系统的全貌、上下游的联防有更进
    2025-11-05
  • 13 个参与 Python 编程挑战的站点

    想学好编程,就是要多思考,多敲代码!用“ 练级” 的方式来学习编程会更有意思,能为我们学习编程提升动力和自豪感,接下来就给大家推荐一些 Python 的编程挑战,以及练习 Python 的 App。这
    2025-11-05
  • 了解微服务失败的这11个原因,预防和及时止损!

    微服务“很香”,它有许多优势,比如更快的开发、更好的可扩展性、更小的独立团队等等。但是,很多团队却在微服务上举步维艰,没有很好利用其优势。原因到底是什么?这是本文作者试图回答的。过去几年,我对推进数字
    2025-11-05
  • 电脑主机箱DIY(让你的电脑更加便携,打造独一无二的主机箱)

    摘要:电脑已经成为现代人生活中不可或缺的一部分,而电脑主机箱作为保护和装配各种硬件的外壳,起到了非常重要的作用。然而,市面上的主机箱款式相对较为单一,大多数都缺乏个性化的设计。在这篇文章...
    2025-11-05
  • 分布式事务浅析及简单实现

    在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。为了对用户提供正确的 CRUD 等语义,我们需要保证这些放置在不同物理机器上
    2025-11-05

最新评论