力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
为了处理大数相加,用字符串来存储数字。要处理字符串相加,大致想法是,按照加法对齐,将单个字符用整型表示,相加后将结果分解为进位0或1和某个数字,然后将该数字用字符形式存进字符串。
按照加法对齐,用双指针的形式来遍历相加。
需要把end1和end2指向的字符转化为数字(减字符0),然后相加,结果是一个整型。将结果分解为进位和单个数字,单个数字存入字符串,进位用于下一次相加。
这里提一下怎么插入字符串,由于加法的规则,每次得到的结果是尾部的数据,所以,需要不断的头插来保证字符的顺序正确,但是头插需要挪动数据(string底层是顺序表),所以效率大打折扣,可以通过尾插O(1)来,然后逆置字符串来替代这种算法。
class Solution {
public:
string addStrings(string num1, string num2) {
int end1 = num1.size() -1;
int end2 = num2.size()-1;
int next = 0;
string s3;//结果字符串
while(end1>=0 ||end2>=0)//两个字符串均要遍历结束
{
int val1 = 0,val2 = 0;
if(end1>=0)
{
val1 = num1[end1--]-'0';
}
if(end2>=0)
{
val2 = num2[end2--] -'0';
}
int ret = val1 +val2 +next;//每一次的相加结果
next = ret / 10;
ret %= 10;//需要存入结果字符串的字符
s3.push_back(ret + '0');//尾插
}
if(next == 1)//最后一次结果会遗漏的进位
{
s3.push_back('1');
}
reverse(s3.begin(),s3.end());
return s3;
}
};