字符串相加

LeetCode每日一题,415. Add Strings

先看题目描述

题目大意就是给定两个只含正整数的两个长字符串,将其相加,并以字符串形式返回

算法和思路

思路就是模拟人工加法

算法流程

  • 初始化进位 carry = 0
  • 从后往前相加,计算 temp = n1 + n2 + carry,将当前位 temp % 10 添加到结果字符串 sb 首位
  • 计算进位,计算 carry = temp / 10,代表当前位相加是否产生了进位
  • 当长度较小的字符串遍历完后,遍历长度较大的字符串剩余部分,按照前面的方法计算进位和当前位,添加到结果字符串 sb 头部
  • 最终返回转成字符串的 sb

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int len1 = num1.length();
int len2 = num2.length();
int len = Math.min(len1, len2);
int carry = 0;
for (int i = 1; i <= len; i++) {
int temp = num1.charAt(len1 - i) - '0' + num2.charAt(len2 - i) - '0' + carry;
sb.insert(0, (char)('0' + temp % 10));
carry = temp / 10;
}
if (len1 > len2) {
for (int i = len1 - len - 1; i >= 0; i--) {
int temp = num1.charAt(i) - '0' + carry;
sb.insert(0, (char)('0' + temp % 10));
carry = temp / 10;
}
}
if (len1 < len2) {
for (int i = len2 - len - 1; i >= 0; i--) {
int temp = num2.charAt(i) - '0' + carry;
sb.insert(0, (char)('0' + temp % 10));
carry = temp / 10;
}
}
if (carry == 1) sb.insert(0, '1');
return sb.toString();
}
}

提交完后去看题解,发现思路是一致的,运行效率也差不多,但是别人写的代码要更加简洁,可以学习下这种写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder res = new StringBuilder("");
int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
while(i >= 0 || j >= 0){
int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int tmp = n1 + n2 + carry;
carry = tmp / 10;
res.append(tmp % 10);
i--; j--;
}
if(carry == 1) res.append(1);
return res.reverse().toString();
}
}