【java刷题23-3】力扣:415. 字符串相加

113 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情


题目、415. 字符串相加

原题链接:415. 字符串相加

题目描述

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

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

/

示例 1:

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

输出:"134"

/

示例 2:

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

输出:"533"

/

示例 3:

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

输出:"0"

解题思路

字符串相加,却不可以将字符直接转化为整形来运算,而且需要输出的依旧是字符串,那么为了得到每个位置上的数字,我们可以利用ASCII码值的加减来获取。

我们首先获取字符串的长度num.length();,然后也就可以确定个位数数字的下标:num.length() - 1;

我们从最末尾数字开始遍历,当前位置的数字通过当前位置的字符减去符号’0‘获取: '0' - '0' = 0;

'1' - '0' = 1;

'2' - '0' = 2;

...

'9' - '0' = 9;

知道获取到当前位置数字的方法后,我们依次将两个字符串相同位置上的数字相加,同时设置一个add参数,记录满十进一的数位。

那么我们每次就将两数字之和的个位数连接进结果的字符串中,十位数则累加进下一次的两数之和中,最终也就得到了我们需要的字符串。

还需要注意的是,我们从个位数开始遍历,所以得到的字符串是从最小位数字开始的,还需要将字符串反转一下,才算完成。

提交代码

class Solution {
    public String addStrings(String num1, String num2) {
        StringBuffer sb = new StringBuffer();
        //从最小位数字下标
        int index_1 = num1.length() - 1;
        int index_2 = num2.length() - 1;
        int add = 0;                    //满十进一

        while(index_1 >= 0 || index_2 >=0 || add != 0){    //从最低位数字开始遍历
        //该数位存在数字,记录下来
            int n1 = index_1 >= 0?num1.charAt(index_1)-'0':0; 
            int n2 = index_2 >= 0?num2.charAt(index_2)-'0':0;
            //同数位数字相加,同时加上满十进一的数
            int sum = n1 + n2 + add;
            //将个位的数字转换为字符,连接起来
            sb.append(sum % 10);
            //记录满十进一
            add = sum / 10;
            //向高位数字遍历
            --index_1;
            --index_2;
        }
        sb.reverse();        //我们从后向前连接数字,连接完成后需要翻转过来才是原本的数字
        return sb.toString();//输出字符串
    }
}

提交结果

在这里插入图片描述