美文网首页
plus one/Multiply Strings

plus one/Multiply Strings

作者: 飞飞廉 | 来源:发表于2017-11-20 20:53 被阅读0次

题目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;最后把每位上上的数字按顺序保存到结果中即可。


image.png

其实关键在于如何将每位相乘的结果存入以为数组。

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;  
};

相关文章

网友评论

      本文标题:plus one/Multiply Strings

      本文链接:https://www.haomeiwen.com/subject/ynbmvxtx.html