题解 | #大数加法#

大数加法

https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

思路一

  • 将从右到左的加法,变成从左到右的加法;
  • 顺序遍历字符串。
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        if(s.length() == 0) return t;
        if(t.length() == 0) return s;

        StringBuilder res = new StringBuilder();
        StringBuilder s1 = new StringBuilder(s);
        StringBuilder s2 = new StringBuilder(t);
        // 逆转原字符串
        s1 = s1.reverse();
        s2 = s2.reverse();
        // 从左到右加法
        res = addInStr(s1, s2);
        // 反转,从右到左加法
        return res.reverse().toString();
    }

    private StringBuilder addInStr(StringBuilder s1, StringBuilder s2){
        int idx1 = 0, idx2 = 0;
        int len1 = s1.length(), len2 = s2.length();
        int carry = 0; // 进位
        StringBuilder res = new StringBuilder();
        while(idx1 < len1 || idx2 < len2 || carry > 0){
            int val = carry; // 先加进位
            if(idx1 < len1){ // 字符串s1
                // val += Integer.parseInt(s1.charAt(idx1++));
                val += s1.charAt(idx1++) - '0';
            }
            if(idx2 < len2){  // 字符串s2
                // val += Integer.parseInt(s2.charAt(idx2++));
                val += s2.charAt(idx2++) - '0';
            }
            carry = val / 10; // 取整得进位
            val = val % 10; // 求余得当前位置和
            // System.out.println("val=" + val + ", carry=" + carry);
            res.append(val);
        }
        return res;
    }
}

思路二

  • 从右向左遍历字符串;
  • 在结果字符串首部进行插入;
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        if(s.length() == 0) return t;
        if(t.length() == 0) return s;

        StringBuilder res = new StringBuilder();
        int idx1 = s.length() - 1;
        int idx2 = t.length() - 1;
        int carry = 0;
        while(idx1 >= 0 || idx2 >= 0 || carry > 0){
            int val = carry;
            if(idx1 >= 0){
                val += s.charAt(idx1--) - '0';
            }
            if(idx2 >= 0){
                val += t.charAt(idx2--) - '0';
            }
            // res.append(val % 10);  // 在尾部插入
            res.insert(0, val % 10);  // 在首部插入
            carry = val / 10;
        }
        // return res.reverse().toString();
        return res.toString();
    }
}
全部评论

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务