算法:154、字符串相加

题目

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

提示:
num1 和num2 的长度都小于 5100
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式

自己的方法:转换成数字相加(未通过)

反正挺想笑的,题目说 不能直接将输入的字符串转换为整型,我以为是不能使用Integer.parseInt(),而我却想的是每次取一个数字字符,乘上10的相对位置的幂次方,然后将这些相加(算是间接的转换成整数形式),可是最后没有通过,因为我使用的是int,int在java中最大表示就是2的32次方-1=2147483648 - 1 = 2147483647,但是给出了一个测试用例,是"6913259244",这显然是int表示不了的。

官方解法:竖加法(就是我们用的两数相加的方法)

算法:154、字符串相加_第1张图片
就像这个样子,只不过使用代码来实现的。
具体实现也不复杂,就是定义两个指针 i i i j j j,分别指向 n u m 1 num1 num1 n u m 2 num2 num2的末尾,即最低位,同时定义一个变量 a d d add add,用来维护进位。然后从末尾到头部逐位相加。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 00,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理。

public String addStrings(String num1, String num2){
        int i = num1.length()-1;
        int j = num2.length()-1;
        int add = 0;
        StringBuffer ans = new StringBuffer();
        while(j >= 0 || i >= 0 || add != 0){
            // 这里就是取出当前位置的数字,后面相加
            int x = i>=0?num1.charAt(i)-'0':0;
            int y = j>=0?num2.charAt(j)-'0':0;
            // 为甚要加add,因为有进位需要加上add
            int result = x+y+add;
            ans.append(result%10);
            add = result/10;
            i--;
            j--;
        }
        ans.reverse();
        return ans.toString();

参考

字符串相加

你可能感兴趣的:(算法题)