题目1:
leetcode 66
给定一个数组表示非负整数,其高位在数组的前面,对这个整数加1
思路:遍历数组的每位,同时处理进位,如果最后还有进位就在数组最前边插入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,才会不断产生进位,而且进位后数字为0。当且仅当说有数位全是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
题目:
求两个字符串数字的相乘,输入的两个数和返回的数都是以字符串格式储存的,这样做的原因可能是这样可以计算超大数相乘,可以不受int或long的数值范围的约束。
思路:
每位想成,然后错位相加,把错位相加后的结果保存到一个以为数组中,然后分别每位上算进位,最后每个数字都变成一位,然后要除掉首位0;最后把每位上上的数字按顺序保存到结果中即可。
其实关键在于如何将每位相乘的结果存入以为数组。
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;
};