1. 程式人生 > 其它 >JavaScript 字串相乘 力扣 探索位元組跳動

JavaScript 字串相乘 力扣 探索位元組跳動

技術標籤:字串演算法javascriptleetcode

字串相乘
給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。

示例 1:

輸入: num1 = “2”, num2 = “3”
輸出: “6”
示例 2:

輸入: num1 = “123”, num2 = “456”
輸出: “56088”
說明:

num1 和 num2 的長度小於110。
num1 和 num2 只包含數字 0-9。
num1 和 num2 均不以零開頭,除非是數字 0 本身。
不能使用任何標準庫的大數型別(比如 BigInteger)或直接將輸入轉換為整數來處理。

思路:

按照平時計算兩數相乘的方式來計算,定義一個長度為num1.length()+num2.length()的int型陣列num來存放結果。

第一步:

i指標遍歷num1字串,j指標遍歷num2字串,從最低位開始計算,i初始為num1.length()-1,j初始為num2.length()-1;將num1的第i位字元,num2的第j位字元轉換為數字,兩數相乘的結果記為sum,將sum%10累加到num[i+j+1]中,進位sum/10累加到num[i+j]中,由於類加後num[i+j+1]可能大於9,所以需要更新num[i+j+1],先將進位num[i+j+1]%10累加到num[i+j]中,再將num[i+j+1]更新為num[i+j+1]%10。

第二步:

遍歷陣列num,去除前導0,將結果拼接起來並返回。

一開始腦子抽了,以為num1[0]得到的是最低位數字,但其實是最高位數字……寫了半天百思不得其解。並且認為答案陣列的長度應該是num1.length*num2.length 但其實是num1.length+num2.length。智商真的不太夠啊!

稍稍吐槽一下js,動態型別轉換做演算法題的時候真的是會出現許多錯誤啊,不知道這樣會不會影響以後的實際運用。這種bug找起來真的不容易

程式碼如下:

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var multiply = function(num1, num2) { if(num1[0]==0||num2[0]==0) return "0"; var ans = new Array(num1.length+num2.length); var t = 0; var sum = 0; for(var i=0;i<ans.length;i++) ans[i]=parseInt('0'); for(var i=num1.length-1;i>=0;i--) { t=parseInt(num1[i]); for(var j=num2.length-1;j>=0;j--) { sum = parseInt(t * parseInt(num2[j])); ans[i+j+1] += parseInt(sum %10); ans[i+j] += parseInt((parseInt(ans[i+j+1]/10) + parseInt(sum /10))); ans[i+j+1] = parseInt(ans[i+j+1]%10); } } while(ans[0]==0) ans.splice(0,1); var str = ans.join(""); return str; };