415. 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
- 一开始我的想法是把两个数分别转为 long 类型,相加后再转成 String 即可。但是如果字符串长度过长,long 也不够用,所以只能原始人解法了。从尾部开始遍历两个字符串,遍历完了某个字符串则直接取另一个字符串的部分,否则取他们对应那一位的和,用一个变量判断是否需要进 1。遍历结束后再判断是否还有进的 1,有则加上即可。
-
public String addStrings(String num1, String num2) { int i = num1.length()-1; int j = num2.length()-1; // 是否需要进 1 boolean addMore = false; String ans = ""; while(i>=0 || j>=0){ int num; // num1 取完了就用 num2 // num2 取完了就用 num1 // 否则用他们的当前位的和 if(i<0 || j<0){ num = i<0?num2.charAt(j) - '0':num1.charAt(i) - '0'; }else{ num = num1.charAt(i) - '0' + num2.charAt(j) - '0'; } // 之前的计算结果需要进 1 现在就加 1 if(addMore){ num++; } if(num>9){ addMore=true; num=num%10; }else{ addMore=false; } ans = num + ans; i--; j--; } // 最后还有没进的 1 就直接加在首位 if(addMore){ ans = 1 + ans; } return ans; }
- 官方题解:需要进一的 1 其实就是
num/10
,当前位无论如何加的也都是num%10
;i 小于 0 时取 num1 的部分为 0 即可,num2 同理;加完如果还需要进 1 的 1 也可以写在循环的条件中,加了这个 1 再退出循环, 所以可以再简化一下: -
public String addStrings(String num1, String num2) { int i = num1.length()-1; int j = num2.length()-1; int add = 0; String ans = ""; while(i>=0 || j>=0 || add>0){ int n1 = i<0?0:num1.charAt(i) - '0'; int n2 = j<0?0:num2.charAt(j) - '0'; int num = n1 + n2 +add; add = num/10; ans = num%10 + ans; i--; j--; } return ans; }