zoukankan      html  css  js  c++  java
  • 字符串相加

    字符串相加

    给定两个字符串形式的非负整数num1num2,计算它们的和。
    注意:

    • num1num2的长度都小于5100
    • num1num2都只包含数字0-9
    • num1num2都不包含任何前导零。
    • 你不能使用任何內建BigInteger库,也不能直接将输入的字符串转换为整数形式。

    示例

    输入: num1 = 990, num2 = 10
    输出: 1000
    

    题解

    /**
     * @param {string} num1
     * @param {string} num2
     * @return {string}
     */
    var addStrings = function(num1, num2) {
        var diff = Array(Math.abs(num1.length - num2.length)).fill(0).join("");
        if(num1.length > num2.length) num2 = diff + num2;
        else num1 = diff + num1;
        var target = "";
        var n = num1.length;
        var carry = 0;
        for(let i=n-1; i>=0; --i){
            let num = ~~(num1[i]) + ~~(num2[i]) + carry;
            if(num >= 10) {
                carry = 1;
                num -= 10;
            }else{
                carry = 0;
            }
            target = num + target;
        }
        if(carry) target = "1" + target;
        return target;
    };
    
    /**
     * @param {string} num1
     * @param {string} num2
     * @return {string}
     */
    var addStrings = function(num1, num2) {
        var p1 = num1.length-1;
        var p2 = num2.length-1;
        var target = "";
        var carry = 0;
        while(p1>=0 || p2>=0 || carry!==0){
            if(p1>=0) carry += ~~(num1[p1--]);
            if(p2>=0) carry += ~~(num2[p2--]);
            target = (carry%10) + target;
            carry = ~~(carry / 10);
        }
        return target;
    };
    

    思路

    首先我的想法是使用填充0的方式进行对位,然后由后向前每一位进行相加处理,使用carry作为进位标记,target为目标字符串,在填0对位完成后进行循环处理,将两个字符串的单个字符转换为int后与进位标记carry相加,然后判断该值是否大于10用以处理是否需要再次进位,之后拼接于目标字符串,在最后判断是否还有最后一次进位,如果有则拼接1作为最后一位进位。之后运用双指针的方式代码更加简洁,同样是使用carry作为进位标记以及加量值,target为目标字符串,不需要进行0填充对位,循环条件是两个指针大于等于0以及有进位三个情况满足一个即可,通过判断指针值是否大于等于0来确定是否将其值加入增量carry,然后将增量取余拼接目标字符串,将增量除10作为进位标记,最后返回目标字符串即可。

    每日一题

    https://github.com/WindrunnerMax/EveryDay
    

    参考

    https://leetcode-cn.com/problems/add-strings
    
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/WindrunnerMax/p/13425323.html
Copyright © 2011-2022 走看看