题目的主要信息:

  • 输入两个字符串表示的整数,对其进行相加运算
  • 字符串中只有字符0-9,即正整数加法运算
  • 字符串长度:1<=n<=100001<=n<=10000

方法一:遍历相加

具体做法:

从两个字符串末尾开始往前遍历每个字符,直到遍历到两个字符串的下标都为0. 将遍历到的字符串转化为数字,如果其中一个字符串已经过了首部,则直接数字记为0.

然后将两个数字与进位变量相加,取余数放入现在这位,整除10作为进位,初始进位变量为0。最后结束之后如果进位变量还有1,则添加在后面。

最后将其逆序并转成字符串输出即可。

alt

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String s1 = scan.next();
            String s2 = scan.next(); //输入两个数
            String res = add(s1, s2); //输出
            System.out.println(res);
        }
    }
 
    private static String add(String s1, String s2) { //两个字符串整数相加
        StringBuilder res = new StringBuilder();
        int n = s1.length() - 1;
        int m = s2.length() - 1;
        int carry = 0; //进位
        while (n >= 0 || m >= 0) { //从两个人字符串最后一位开始相加
            char c1 = n >= 0 ? s1.charAt(n--) : '0'; //没有了就用0代替
            char c2 = m >= 0 ? s2.charAt(m--) : '0';
            int sum = (c1 - '0') + (c2 - '0') + carry; //两个数子与进位相加
            res.append(sum % 10); //余数添加进结果
            carry = sum / 10;  //进位
        }
 
        if (carry == 1) { //最后的进位
            res.append(carry);
        }
        return res.reverse().toString(); //反转后转成字符串
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为较长字符串的长度,遍历最多是较长的字符串长度
  • 空间复杂度:O(n)O(n),保留运算结果的StringBuilder的长度最多为n+1n+1

方法二:大整数运算

具体做法:

直接利用Java的大整数类,将字符串转变成大整数类型,然后将后者加到前者。

import java.util.Scanner;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String s1 = scan.next();
            String s2 = scan.next(); //输入两个数
            BigInteger a = new BigInteger(s1); //将字符串转成大整数
            BigInteger b = new BigInteger(s2);
            System.out.println(a.add(b)); //大整数相加
        }
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),大整数相加复杂度也是较长字符串的长度
  • 空间复杂度:O(n)O(n),大整数记录的空间最多是较长字符串的长度