【刷题笔记】415. 字符串相加

143 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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 都不包含任何前导零

二、思路分析:

  • 声明一个结果字符数组 rs , 长度为 最长的加数+1
  • 把结果初始化为0填充
  • 把短的数 copy 进结果数组.(这个是为了好对齐)
  • 再把结果数组和 长的加数按位相加.
  • 最后要处理一次 carry.
  • 最后把 rs 中左边的多余的0去除.

三、AC 代码:

class Solution {
    public String addStrings(String num1, String num2) {
        char[] rs = new char[Math.max(num1.length(),num2.length()) + 1];
        for(int i=0;i<rs.length;i++){
            rs[i] = '0';
        }
        char[] a1Nums = num1.length() >= num2.length() ? num1.toCharArray() : num2.toCharArray();
        char[] toCopy = num1.length() >= num2.length() ? num2.toCharArray() : num1.toCharArray();


        for(int i=0;i<toCopy.length;i++){
            rs[rs.length-1-i] = toCopy[toCopy.length-1-i];
        }

        // add a1 + rs
        int carray = 0;
        for(int i=0;i<a1Nums.length;i++){
            int x = a1Nums[a1Nums.length-1-i] - '0';
            int y = rs[rs.length-1-i] - '0';
            int sum = x + y + carray;
            carray = sum / 10;
            rs[rs.length-1-i] = (char)((sum % 10) + '0');
        }
        if(carray>0){
            int x =rs[rs.length-1-a1Nums.length] - '0';
            rs[rs.length-1-a1Nums.length] = (char)(x + carray+'0');
        }

        int nz=0;
        for(nz=0;nz<rs.length;nz++){
            if(rs[nz] != '0'){
                break;
            }
        }
        if(nz== rs.length){
            return "0";
        }
        for(int i=0;i<nz;i++){
            rs[i] = ' ';
        }

        return new String(rs).trim(); 
    }
}