题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
- num1 和num2 的长度都小于 5100.
- num1 和num2 都只包含数字 0-9.
- num1 和num2 都不包含任何前导零。
- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
题目链接: https://leetcode-cn.com/problems/add-strings/
思路1
模拟人做加法。首先在短的字符串前面补零,然后从后往前加。代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
if(num1.empty()) return num2;
if(num2.empty()) return num1;
int len1 = num1.length();
int len2 = num2.length();
int len = max(len1, len2);
if(len1>len2){ // 较短的字符串前面补0
int delta = len1-len2;
while(delta>0){
num2 = "0"+num2;
delta--;
}
}else if(len2>len1){
int delta = len2-len1;
while(delta>0){
num1 = "0"+num1;
delta--;
}
}
string ans = "";
int carry = 0;
for(int i=len-1; i>=0; i--){
int s = (num1[i]-'0')+(num2[i]-'0')+carry;
ans = to_string(s%10) + ans;
carry = s/10;
}
if(carry!=0){
ans = "1"+ans;
}
return ans;
}
};
- 时间复杂度:O(n)
- 空间复杂度: O(n)
ans是额外的字符串,所占空间随着输入字符串长度的增加线性增长。
思路1改进:
思路1首先需要在较短的字符串前面补0,然后再相加。可以用使用类似于链表相加的方法,使用两个指针分别指向两个字符串的末尾,然后逐渐往前移动,这样避免了补零的操作。代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
if(num1.empty()) return num2;
if(num2.empty()) return num1;
int l1 = num1.length()-1;
int l2 = num2.length()-1;
int carry = 0;
string ans = "";
while(l1>=0 || l2>=0){
int x = l1>=0? (num1[l1]-'0'):0;
int y = l2>=0? (num2[l2]-'0'):0;
int s = x+y+carry;
ans = to_string(s%10) + ans;
carry = s/10;
if(l1>=0) l1--;
if(l2>=0) l2--;
}
if(carry!=0){
ans = "1"+ans;
}
return ans;
}
};
时间空间复杂度和改进前一样。