題目1:
leetcode 66
給定一個數(shù)組表示非負整數(shù),其高位在數(shù)組的前面酷宵,對這個整數(shù)加1
思路:遍歷數(shù)組的每位,同時處理進位,如果最后還有進位就在數(shù)組最前邊插入1即可
注意計算flag的時候需要向下取整卤档。
var plusOne = function(digits) {
var flag=1;
for(var i=digits.length-1;i>=0;i--){
var a=digits[i]+flag;
digits[i]=a%10;
flag=Math.floor(a/10);//注意向下取整取的商
}
if(flag===1){
digits.unshift(1)
}
return digits;
};
上邊那種做法不僅適用于加1,還適用于加k,由于這道題目是加1程剥,只有從低位開始全是9劝枣,才會不斷產(chǎn)生進位,而且進位后數(shù)字為0织鲸。當且僅當說有數(shù)位全是9的時候舔腾,才會多進出1位,此時最高位是1昙沦,其他所有位全是0(由于多出1位琢唾,因此需要在最后添加1個0)
var plusOne = function(digits) {
for(var i=digits.length-1;i>=0;--i){
if(digits[i]===9){
digits[i]=0;
}else{
digits[i]++;
return digits;
}
}
digits.unshift(1);
return digits;
};
題目2:
leetcode 43
題目:
求兩個字符串數(shù)字的相乘,輸入的兩個數(shù)和返回的數(shù)都是以字符串格式儲存的盾饮,這樣做的原因可能是這樣可以計算超大數(shù)相乘采桃,可以不受int或long的數(shù)值范圍的約束。
思路:
每位想成丘损,然后錯位相加普办,把錯位相加后的結果保存到一個以為數(shù)組中,然后分別每位上算進位徘钥,最后每個數(shù)字都變成一位衔蹲,然后要除掉首位0;最后把每位上上的數(shù)字按順序保存到結果中即可呈础。
其實關鍵在于如何將每位相乘的結果存入以為數(shù)組舆驶。
var multiply = function(num1, num2) {
var n1=num1.length,
n2=num2.length,
k=n1+n2-2,
v=[],
flag=0;
for(var i=0;i<n1+n2;i++){
v[i]=0
}
for(var i=0;i<n1;i++){
for(var j=0;j<n2;j++){
v[k-i-j]+=(num1[i]-'0')*(num2[j]-'0');//關鍵
}
}
for(var i=0;i<n1+n2;i++){
v[i]+=flag;
flag=Math.floor(v[i]/10);
v[i]%=10;
}
var m=k+1;
while(v[m]===0){
m--;
}
if(m<0) return "0";
var res='';
for(var i=m;i>=0;i--){
res+=v[i];
}
return res;
};