JavaScript 字串相乘 力扣 探索位元組跳動
字串相乘
給定兩個以字串形式表示的非負整數 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;
};