#LeetCode——415.字符串相加

一、题目介绍

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1:

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

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

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

二、思路分析

这道题其实考察我们的是竖式加法。我举个例子:

  4  5  6                
+    7  7
-------------     
  5  3  3 

我们所需要考虑的问题:1、怎么将字符串中的每个字符转换成数字并进行相加?

                                        2、相加后的数字怎么保存?怎么变成字符串?

                                        3、相加之后进位的问题怎么解决?

先说第一个问题:

我们可以利用 charAt() 方法对字符串截取成字符,用 字符- 字符 的思想转换成数字。比如:'6' - '0' = 6 , '7' - '0' = 7【其实是ASCII码进行相减的操作。6 的十进制ASCII码:54。0的十进制ASCII码:48】

第二个问题:

使用StringBuilder 类进行字符串拼接的,由于我们是从个位开始相加,最终保存在StringBuilder 中 的 也是从个位开始的,所以我们最后返回的时候需要进行反转一下

第三个问题:

使用辗转相除法来保存结果和进位。

比如:6+7 = 13 ,那么我们 保存到StringBuilder 中的结果 应该 3 【1是进位】,用代码表达出来:StringBuilder.append( (6+7) % 10) ; 这样就把 3 增加进去了。

还需要用一个变量 add 保存进位的值,怎么求得变量的值呢?

(6+7) / 10 =1 ;就得出来进位了。

三、代码

 public static String addStrings(String num1, String num2) {
        //双指针分别指向num1,num2的末尾,从个位开始处理.....
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        //保存进位
        int add = 0;
        //保存结果
        StringBuilder sb = new StringBuilder();
        
        while (add != 0 || i >= 0 || j >= 0) {
            /*将 num1 的每个元素转换成数字*/
            int x = i < 0 ? 0 : num1.charAt(i) - '0';
            /*将 num2 的每个元素转换成数字*/
            int y = j < 0 ? 0 : num2.charAt(j) - '0';
            /*相加结果加到sb中,辗转相除法。*/
            sb.append((x + y + add) % 10);
            /*求出进位*/
            add = (x + y + add) / 10;

            i--;
            j--;

        }
        /*reverse()进行反转*/
        return sb.reverse().toString();
    }

 

你可能感兴趣的:(leetcode,算法,散列表)