一:题目
415. 字符串相加 - 力扣(LeetCode)
解释:该题的意义在于,两个数字相加,如果数字超过了int,甚至超过了long long的边界,依旧可以用这种将两个数字转换成两个字符串相加的形式来得到相加的答案,答案存储到了字符数组中
二:思路
①:相加就会有进位,进位最大就是1(因为最大的单位数就是9+9,进位也只是1),next初始化为0;
②:相加意味着要num1和num2都从后往前的遍历,所以我们用end1和end2来代表下标来表示num1和num2的最后一个字符
③:num1和num2相加的结果,是一个一个字符的得到的,必然要存进一个string类的对象中,可以采用不断地头插(因为得到的结果是从后往前的,比如十位,百位,千位,所以是头插),也可以直接+=,再reverse一下,后面种方法更好,因为insert会频繁的挪动数据,而+=仅仅是逆置一次
三:代码
①:头插版本
class Solution {
public:string addStrings(string num1, string num2) {int next = 0; //控制进位的值int end1 = num1.size()-1;//-1才让end1对应上最后一个字符的下标int end2 = num2.size()-1;//同理string retstr;//字符数组retstr用来存储最后得到的正确相加结果while(end1>=0 || end2>=0)//两个字符串都遍历结束了 才终止运算{int a = 0;int b = 0;if(end1>=0)a = num1[end1--]-'0';//a用来保存num1中取出的字符对应的数字的值if(end2>=0)b = num2[end2--]-'0';//b用来保存num2中取出的字符对应的数字的值int sum = a+b+next;//sum用来存储一次相加的总结果char c = sum%10 + '0';//通过sum%10 得到该位的正确结果 在+'0'转换成字符next = sum/10;//通过sum/10 得到进位的值retstr.insert(0,1,c);//不断地头插c c是该位运算得到的结果}if(next == 1)//最后若进位还是1 retstr.insert(0,1,'1');//则需要把'1'写在最前面 例如99+1 得到100return retstr;//返回这个字符数组}
};
②:+=再reverse版本
class Solution {
public:string addStrings(string num1, string num2) {int next = 0; int end1 = num1.size()-1;int end2 = num2.size()-1;string retstr;while(end1>=0 || end2>=0){int a = 0;int b = 0;if(end1>=0)a = num1[end1--]-'0';if(end2>=0)b = num2[end2--]-'0';int sum = a+b+next;char c = sum%10 + '0';next = sum/10;retstr+=c;//用+=}if(next == 1)retstr+='1';reverse(retstr.begin(),retstr.end());//再逆置return retstr; }
};
Q:为什么两个字符串都遍历结束了 才终止运算?
A:因为若是"999"+"1"这种 下面的"1"早早结束了,但进位值next为1,会不断地让"999"进行运算,所以应该两个字符串都遍历结束了 才终止运算