「算法」大数相乘 | 刷题打卡

494 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

原题链接 👉 43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

注意:

  • num1 和 num2 的长度小于110。
  • num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

二、思路分析:

思路1:

multiply('11', '99')为例,思路如下:

  1. 初始化一个数组res用来存放计算结果
  2. 双重for循环,从后往前,遍历str1和str2,将str1[i]*str2[j]+res[i+j]的结果存储到res中。
    • 一次循环后,res = [empty, 9,9]
    • 二次循环后,res = [9, 18,9]
  3. 从后往前遍历res
    • res[index - 1] += parseInt(res[index] / 10),res当前项取整和res前一项相加(完成>10进一的操作)
    • res[index] %= 10,res当前项取余

三、完整代码:

思路1:

function multiply(str1, str2) {
  if (str1 == '0' || str2 == '0') return '0'
  let res = [],
    i = str1.length - 1,
    j = str2.length - 1
  for (; i >= 0; i--) {
    let n1 = str1[i] - '0'
    j = str2.length - 1
    for (; j >= 0; j--) {
      let n2 = str2[j] - '0'
      res[i + j] = res[i + j] || 0
      res[i + j] += n1 * n2
    }
  }
  let index = res.length - 1
  while (index >= 1) {
    res[index - 1] += parseInt(res[index] / 10)
    res[index] %= 10
    index--
  }
  return res.join('')
}

复杂度分析

  • 时间复杂度:O(n*m),n和m分别是两个字符串的长度,需要计算 str1 的每一位和 str2 的每一位的乘积。
  • 空间复杂度:O(n+m),需要创建一个长度为 m+n 的数组存储乘积。

四、总结:

大数相乘要想到利用数组来存放运算结果。