昨晚用js写了个大数相乘的函数,模拟写竖式计算,但性能太低,算得很慢。后来在leetCode看了高票答案,赞叹算法的神奇。传送门=>LeetCode-Multiply Strings
引用高票答主的图片:
没想到下标之间还有这样的对应关系。算法工程师真的活该拿高薪!
因为他是用java写的,我转化成js如下
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
let multiply = function(num1, num2) {
//判断输入是不是数字
if(isNaN(num1) || isNaN(num2)) return ''
let len1 = num1.length,
len2 = num2.length
let ans = []
//这里倒过来遍历很妙,不需要处理进位了
for (let i = len1 - 1; i >= 0; i--) {
for (let j = len2 - 1; j >= 0; j--) {
let index1 = i + j,
index2 = i + j + 1
let mul = num1[i] * num2[j] + (ans[index2] || 0)
ans[index1] = Math.floor(mul / 10) + (ans[index1] || 0)
ans[index2] = mul % 10
}
}
//去掉前置0
let result = ans.join('').replace(/^0+/,'')
//不要转成数字判断,否则可能会超精度!
return !result ? '0' : result
}
js数组有join()方法,感觉代码要简洁一些。数组直接用字面量也不需要提前分配内存。
为了增强代码的强壮性,函数第一行是判断输入的合法性,不是数字也就没有进行运算的必要了,返回一个空串。原高票答案没有做这方面的处理,输入字母的话结果始终是2401,不清楚是什么原因,也不是ASCII码,知道的还请多多指教。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。