大数相加,也就是两个字符串相加,最后返回的还是字符串。我们知道整数相加是从个位开始加起的,字符串相加也要从个位加起,我们需要使用过 3 个变量:

一个是 i 指向第一个数字,一个是 j 指向第二个数字,还一个是 carry 表示进位的值。

刚开始的时候 ij 分别指向字符串的最后一个字符,也就是个位,两个数相加最多只能进一位,所以 carry 要么是 0 要么是 1

alt

Java代码:

    public String solve(String s, String t) {
        StringBuilder ans = new StringBuilder();
        int i = s.length() - 1, j = t.length() - 1, carry = 0;
        while (i >= 0 || j >= 0 || carry != 0) {
            // x 表示 i 指向的字符,如果指向空,则返回 0 。
            int x = i < 0 ? 0 : s.charAt(i--) - '0';
            int y = j < 0 ? 0 : t.charAt(j--) - '0';
            int sum = x + y + carry;// 两个数字相加在加上进位的值
            ans.append(sum % 10);// 取相加的个位数字
            carry = sum / 10;// 进位的值
        }
        return ans.reverse().toString();// 对字符串反转
    }

C++代码:

public:
    /**
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        string ans;
        int i = s.length() - 1, j = t.length() - 1, carry = 0;
        while (i >= 0 || j >= 0 || carry != 0) {
            // x 表示 i 指向的字符,如果指向空,则返回 0 。
            int x = i < 0 ? 0 : s[i--] - '0';
            int y = j < 0 ? 0 : t[j--] - '0';
            int sum = x + y + carry;// 两个数字相加在加上进位的值
            ans += to_string(sum % 10);// 取相加的个位数字
            carry = sum / 10;// 进位的值
        }
        reverse(ans.begin(), ans.end());// 对字符串反转
        return ans;
    }

各大厂算法面试题已经整理好了,请看这里:《算法专栏》