题目描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
方法1:
主要思路:
(1)先处理特殊的情形,既两个字符串中其中一个为空的情况;
(2)对于两个字符串的相加的情形,则直接使用两个字符串的反向遍历迭代器实现从后面向前面的遍历,并在遍历相加的过程中,避免某个迭代器已经到反向终点的情形;
class Solution {
public:
string addStrings(string num1, string num2) {
//处理特殊的情形
if(num1.empty()){
return num2;
}
if(num2.empty()){
return num1;
}
string res;
res.reserve(5100);
//反向迭代
auto it1=num1.rbegin();
auto it2=num2.rbegin();
int higher=0;//标识是否进位
//直到两个迭代器都终止
while(it1!=num1.rend()||it2!=num2.rend()){
int tmp=0;//当前两个位的和
//若两个字符串都没有遍历到终点
if(it1!=num1.rend()&&it2!=num2.rend()){
tmp=(*it1+*it2+higher)-2*('0');
++it1;
++it2;
}//若其中的一个迭代器遍历到终点的情形
else if(it1!=num1.rend()){
tmp=(*it1+higher)-('0');
++it1;
}
else {
tmp=(*it2+higher)-('0');
++it2;
}
//对于两个位的和大于9的情形
if(tmp>9){
higher=1;
res+=(char)(tmp-10+'0');
}//小于等于9的情形
else{
higher=0;
res+=(char)(tmp+'0');
}
}
//处理最终是否进位的情形
if(higher){
res+='1';
}
//将获得的字符串反向
reverse(res.begin(),res.end());
return res;
}
};