题目来源于leetcode,解法和思路仅代表个人观点。传送门。
难度:简单
用时:00:30:00(惭愧啊,写了好久)
题目
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路
大数相加的思路。
- 把两个字符串中公共的部分相加起来。(考虑进位carry)
- 把更长那个字符串,的其余部分,与进位carry,相加。(我的代码实现直接简单的循环相加了,carry!=0的时候就break,直接复制剩余部分)
- 加上进位。(如果进位不为0)
代码
class Solution {
public String addStrings(String num1, String num2) {
int i,j;
int carry = 0;
StringBuilder sum = new StringBuilder();
for(i=num1.length()-1,j=num2.length()-1;i>=0&&j>=0;i--,j--){
int s1 = num1.charAt(i) - '0' + num2.charAt(j) - '0' + carry;
if(s1 >= 10){
carry = 1;
}else{
carry = 0;
}
char s2 = (char) ('0' + s1%10);
sum.append(s2);
}
//部分还有剩余
String left = new String();
if(i>=0){
for(int p=i;p>=0;p--){
int s1 = num1.charAt(p) - '0' + carry;
if(s1 >= 10){
carry = 1;
}else{
carry = 0;
left = num1.substring(0,p);
char s2 = (char) ('0' + s1%10);
sum.append(s2);
break;
}
char s2 = (char) ('0' + s1%10);
sum.append(s2);
}
}else if(j>=0){
for(int p=j;p>=0;p--){
int s1 = num2.charAt(p) - '0' + carry;
if(s1 >= 10){
carry = 1;
}else{
carry = 0;
left = num2.substring(0,p);
char s2 = (char) ('0' + s1%10);
sum.append(s2);
break;
}
char s2 = (char) ('0' + s1%10);
sum.append(s2);
}
}
if(carry!=0){
int s1 = carry;
char s2 = (char)('0'+s1%10);
sum.append(s2);
}
String ans = left + sum.reverse().toString();
return ans;
}
}
算法复杂度
时间复杂度:O(n),n为两个字符串中,最长的字符串的长度。
空间复杂度:O(n),n为两个字符串中,最长的字符串的长度。