14

昨晚用js写了个大数相乘的函数,模拟写竖式计算,但性能太低,算得很慢。后来在leetCode看了高票答案,赞叹算法的神奇。传送门=>LeetCode-Multiply Strings

引用高票答主的图片:

clipboard.png
没想到下标之间还有这样的对应关系。算法工程师真的活该拿高薪!
因为他是用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码,知道的还请多多指教。


KingsonJS
76 声望0 粉丝

菜鸟成长中...