日新刷题 - 415. 字符串相加

1,176 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

一、题目描述:

415. 字符串相加

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示:

  • 1 <= num1.length, num2.length <= 10^4
  • num1 和num2 都只包含数字 0-9
  • num1 和num2 都不包含任何前导零

二、思路分析:

整体思路:字符串转为字符数组,每个字符转为数字来模拟两个数字相加的过程。

注意点

  • 数字字符取对应的数字 可以直接charNums[i] - '0';
  • 从后向前遍历,双指针分别从两个数组的末尾开始,当数组长度不一致时,肯定有指针先指到负数,这里直接赋0
  • index遍历到0的时候,这时候直接将sum值加到字符串开头,而不是sum % 10。
  • 字符串拼接可以直接拼接,也可以调用StringBuilder的insert(index, int) api 在index位置加上int的字符串形式。

三、AC 代码:

class Solution {
    public String addStrings(String num1, String num2) {
        // 思路:转为字符数组模拟加法的过程 
        char[] n1 = num1.toCharArray();
        char[] n2 = num2.toCharArray();

        int index = Math.max(n1.length - 1, n2.length -1);
        // 双指针去操作字符数组
        int left = n1.length -1 ;
        int right = n2.length -1;
        // 进位模拟相加
        int extra = 0;
        // 指针对应的数字 溢出位在循环中处理0
        int ln = 0;
        int rn = 0;
        // 倒序遍历模拟加法
        // StringBuilder sb = new StringBuilder();
        String ans = "";

        for (int i = index; i >=0; i--) {
            ln = left <0 ? 0 : n1[left] - '0';
            rn = right < 0 ? 0 : n2[right] - '0';
            int sum = ln + rn + extra;
            // 进位滚动更新
            extra = sum /  10;
             // 在结果字符串0的位置插入算出来的数字 最后的时候进位要直接展示
            // sb.insert(0, index != 0 ? sum % 10 : sum);
            ans = String.valueOf(index != 0 ? sum % 10 : sum) + ans;
            // 指针更新
            index -- ;
            left--;
            right--;
        }
        // return sb.toString();
        return ans;
    }
}

范文参考:

【儿须成名酒须醉】Python3+模拟 - 字符串相加 - 力扣(LeetCode)