难度:简单
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
- num1 和num2 的长度都小于 5100.
- num1 和num2 都只包含数字 0-9.
- num1 和num2 都不包含任何前导零。
- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
解题思路:
设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;
计算进位: 计算 carry = sum/10,代表当前位相加是否产生进位;
添加当前位: 计算 sum=sum + carry,并将当前位 sum% 10 添加至 StringBuilder尾部;
当遍历完 num1,num2 后跳出循环,并根据 carry 值决定是否在头部添加进位 1,最终翻转StringBuilder返回 即可。
代码实现:
public String addStrings(String num1, String num2) {
int i = num1.length()-1;
int j = num2.length()-1;
int carry = 0;
StringBuilder sb = new StringBuilder();
int sum = 0;
int res = 0;
while(i>=0 || j>=0){
if(i>=0){
sum += num1.charAt(i)-'0';
}
if(j>=0){
sum += num2.charAt(j)-'0';
}
sum = sum + carry;
res = sum%10;
carry = sum/10;
sb.append(res);
sum = 0;
i--;
j--;
}
if(carry>0){
sb.append('1');
}
return sb.reverse().toString();
}
复杂度分析
- 时间复杂度: O ( max ( len 1 , len 2 ) ) O(\max(\textit{len}_1,\textit{len}_2)) O(max(len1,len2)),其中 len 1 = num1 . l e n g t h , len 2 = num2 . l e n g t h \textit{len}_1=\textit{num1}.length,\textit{len}_2=\textit{num2}.length len1=num1.length,len2=num2.length。
- 空间复杂度: O ( 1 ) O(1) O(1)。