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