昨晚用js寫了個大數相乘的函數,模擬寫豎式計算,但性能過低,算得很慢。後來在leetCode看了高票答案,讚歎算法的神奇。傳送門=>LeetCode-Multiply Stringsjava
引用高票答主的圖片:算法
沒想到下標之間還有這樣的對應關係。算法工程師真的活該拿高薪!
由於他是用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碼,知道的還請多多指教。函數