算法题:字符串相加

103 阅读3分钟
// 字符串相加类
public class StringAddition {
    // 方法:将两个字符串表示的非负整数相加
    // 输入:两个字符串num1和num2,分别表示两个非负整数
    // 输出:字符串表示的两个非负整数相加的结果
    public String addStrings(String num1, String num2) {
        // 使用StringBuilder来构建结果字符串,因为它支持高效的字符串插入操作
        StringBuilder sb = new StringBuilder();
        // 进位初始化为0
        int carry = 0;
        // 从字符串的末尾开始遍历,因为低位在字符串的末尾
        int i = num1.length() - 1, j = num2.length() - 1;
        
        // 当两个字符串都还有字符未处理,或者存在进位时,继续循环
        while (i >= 0 || j >= 0 || carry != 0) {
            // 初始化当前位的和为进位值
            int sum = carry;
            // 如果num1还有字符,将当前字符转换为数字并加到和中
            if (i >= 0) sum += num1.charAt(i--) - '0';
            // 如果num2还有字符,将当前字符转换为数字并加到和中
            if (j >= 0) sum += num2.charAt(j--) - '0';
            // 将和的个位数插入到StringBuilder的开头,实现逆序构建结果字符串
            sb.insert(0, sum % 10);
            // 更新进位值
            carry = sum / 10;
        }
        
        // 将StringBuilder转换为字符串并返回
        return sb.toString();
    }
}

这段代码实现了两个以字符串形式表示的非负整数的相加。 它使用了StringBuilder来高效地构建结果字符串,并从字符串的末尾(即整数的低位)开始遍历,逐位相加,并处理进位。 最后,将StringBuilder转换为字符串并返回。 这种方法避免了将字符串转换为整数进行相加可能导致的溢出问题,并且能够高效地处理大数相加的情况。

输入输出示例

输入示例 1:

String num1 = "123";
String num2 = "456";

输出示例 1:

"579"

解释:字符串"123"和"456"分别表示数字123和456,它们相加的结果为579,因此输出为"579"。

输入示例 2:

String num1 = "99";
String num2 = "1";

输出示例 2:

"100"

解释:字符串"99"和"1"分别表示数字99和1,它们相加的结果为100,因此输出为"100"。

输入示例 3:

String num1 = "0";
String num2 = "0";

输出示例 3:

"0"

解释:字符串"0"和"0"分别表示数字0,它们相加的结果仍然为0,因此输出为"0"。

输入示例 4:

String num1 = "1000000000";
String num2 = "999999999";

输出示例 4:

"1999999999"

解释:这个示例展示了如何处理大数相加的情况。字符串"1000000000"和"999999999"分别表示数字10亿和9亿9千9百9十9万9千9百9十9,它们相加的结果为19亿9千9百9十9万9千9百9十9,因此输出为"1999999999"。这个例子展示了该方法的优势,即能够处理大数相加而不会导致整数溢出。