题目描述
给定两个字符串形成的非负整数num1
和 num2
,计算它们的和。
注意: :
num1
和num2
的长度都小于5100
;num1
和num2
都质保函数字0-9
;num1
和num2
都不包含任何前导零;- 你不能使用任何BigInteger库,也不能直接将输入的字符转换为整数形式;
思路分析
难度是简单 ,题目给出字符串均由数字字符组成,则我们只需要按倒序遍历即可,这里需要一点小知识就是ASCII
码中的数字字符是紧邻并按大小顺序排列的且字符相减为ASCII
的整型数值差,即'9'-'0' = 9
。
接收容器使用StringBuilder
,数字相加的详细讲解可参见Leetcode 2 两数相加,这里直接给出完整代码:
解题代码
public static String solution(String a, String b) {
if(a == null || a.length() == 0) return b;
if(b == null || b.length() == 0) return a;
StringBuilder res = new StringBuilder();
int carry = 0;
for(int i = a.length() - 1, j = b.length() - 1;
i >=0 || j >= 0; i--, j--){
int v1 = i >= 0 ? a.charAt(i) - '0': 0;
int v2 = j >= 0 ? b.charAt(j) - '0' : 0;
carry = (v1 + v2) / 10;
res.append((v1 + v2) % 10);
}
res.append(carry == 1 ? '1' : "");
return res.reverse().toString();
}
复杂度分析
这里我们设m, n
为输入字符串的长度;
时间复杂度: 我们对输入的字符串均进行了一次遍历,故时间复杂度为O(max(m, n))
;
空间复杂度: 我们使用了res
存储了结果, 故空间复杂度为O(max(m, n))
;
Github源码
完整可运行文件请访问GitHub。