本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
原题链接 👉 43. 字符串相乘
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
二、思路分析:
思路1:
以multiply('11', '99')为例,思路如下:
- 初始化一个数组
res用来存放计算结果 - 双重for循环,从后往前,遍历str1和str2,将
str1[i]*str2[j]+res[i+j]的结果存储到res中。- 一次循环后,res = [empty, 9,9]
- 二次循环后,res = [9, 18,9]
- 从后往前遍历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 的数组存储乘积。
四、总结:
大数相乘要想到利用数组来存放运算结果。