跳到主要内容

43.字符串相乘

链接:43.字符串相乘
难度:Medium
标签:数学、字符串、模拟
简介:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

题解 1 - javascript

  • 编辑时间:2020-05-13
  • 执行用时:68ms
  • 内存消耗:34MB
  • 编程语言:javascript
  • 解法介绍:使用 BigInt 直接运算。
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var multiply = (num1, num2) => (BigInt(num1) * BigInt(num2)).toString();

题解 2 - javascript

  • 编辑时间:2020-05-13
  • 执行用时:108ms
  • 内存消耗:38.3MB
  • 编程语言:javascript
  • 解法介绍:转换成数组进行每位相乘。
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var multiply = (num1, num2) => {
if (num1 === '0' || num2 === '0') return '0';
const toArr = s =>
s
.split('')
.map(v => +v)
.reverse();
const merge = (arr1, arr2) => {
let jin = 0;
let i = 0;
let num;
for (len = arr2.length; i < len; i++) {
if (arr1[i] === undefined) num = arr2[i] + jin;
else num = arr1[i] + arr2[i] + jin;
jin = Math.floor(num / 10);
arr1[i] = num % 10;
}
if (jin !== 0) arr1[i] = jin;
};
const arr1 = toArr(num1);
const arr2 = toArr(num2);
let jin = 0;
const res = [],
temp = [];
for (let i = 0, len1 = arr1.length; i < len1; i++) {
temp.length = 0;
for (let tempNum = 1; tempNum <= i; tempNum++) temp.push(0);
for (let j = 0, len2 = arr2.length; j < len2; j++) {
const num = arr2[j] * arr1[i] + jin;
jin = Math.floor(num / 10);
temp.push(num % 10);
}
if (jin !== 0) {
temp.push(jin);
jin = 0;
}
merge(res, temp);
}
return res.reverse().join('');
};

题解 3 - typescript

  • 编辑时间:2020-08-13
  • 执行用时:88ms
  • 内存消耗:37.9MB
  • 编程语言:typescript
  • 解法介绍:使用 BigInt 直接相乘。
function multiply(num1: string, num2: string): string {
return BigInt(num1) * BigInt(num2) + '';
}

题解 4 - typescript

  • 编辑时间:2021-07-21
  • 执行用时:92ms
  • 内存消耗:39.4MB
  • 编程语言:typescript
  • 解法介绍:bigint。
function multiply(num1: string, num2: string): string {
return BigInt(num1) * BigInt(num2) + '';
}

题解 5 - typescript

  • 编辑时间:2021-07-21
  • 执行用时:100ms
  • 内存消耗:40.4MB
  • 编程语言:typescript
  • 解法介绍:统计每一位。
function multiply(num1: string, num2: string): string {
const n1 = num1.length;
const n2 = num2.length;
const list1 = new Array(n1)
.fill(0)
.map((_, i) => +num1[i])
.reverse();
const list2 = new Array(n2)
.fill(0)
.map((_, i) => +num2[i])
.reverse();
const n = n1 + n2 - 1;
const ans: number[] = new Array(n).fill(0);
for (let i = 0; i < n1; i++) {
for (let j = 0; j < n2; j++) {
ans[i + j] += list1[i] * list2[j];
}
}
let add = 0;
for (let i = 0; i < n; i++) {
if (add) {
ans[i] += add;
add = 0;
}
if (ans[i] >= 10) {
add = ~~(ans[i] / 10);
ans[i] = ans[i] % 10;
}
}
if (add) ans.push(add);
while (ans.length > 1 && ans[ans.length - 1] === 0) ans.pop();
return ans.reverse().join('');
}