个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【LeetCode】
🍓希望我们一起努力、成长,共同进步。
题目链接
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例一:
示例二:
示例三:
这道题最好不要将字符串转换为数字,因为数据比较大,容易造成溢出。那么就只能通过字符串来模拟加法运算,从低位到高位逐位相加,并将进位记录下来。最后将不能进位的结果字符串与进位字符串相加即为最终结果。
解题思路(尾插):
1、定义两个指针分别指向两个字符串的末位:
end1 = num1.size()-1
,end2 = num2.size()-1
,同时定义一个变量 carry,即起初定义一个int carry = 0;
记录进位;
2、从末位开始逐位相加,同时将进位加入下一位运算中,结果加入新的字符串中,如:(num1.[end1] - ‘0’ + num2.[end2] - ‘0’ + carry) % 10
;
3、逆序最终得到的字符串,去掉可能存在的前导零后,输出结果即可。
解题代码一(尾插):
class Solution {
public:string addStrings(string num1, string num2) {string str;int end1 = num1.size()-1;int end2 = num2.size()-1;int carry = 0;while(end1>=0||end2>=0){int val1 = end1>=0?num1[end1]-'0':0;int val2 = end2>=0?num2[end2]-'0':0;int ret = val1+val2+carry;carry = ret/10;ret = ret%10;str += ('0'+ret);end1--;end2--;}if(carry == 1){str += '1';}reverse(str.begin(),str.end());return str;}
};
解题思路二(头插):
如果要使用头插的话,这里使用了string类中的
insert
,思路和上面的思路大体其实是一样的,只不过是使用了一个insert
。这种方法效率比较低,但是可以通过,大家自行选择。
解题代码二(头插):
class Solution {
public:string addStrings(string num1, string num2) {string str;int end1 = num1.size()-1;int end2 = num2.size()-1;int carry = 0;while(end1>=0||end2>=0){int val1 = end1>=0?num1[end1]-'0':0;int val2 = end2>=0?num2[end2]-'0':0;int ret = val1+val2+carry;carry = ret/10;ret = ret%10;str.insert(str.begin(),ret+'0');//str += ('0'+ret);end1--;end2--;}if(carry == 1){//str += '1';str.insert(str.begin(),'1');}//reverse(str.begin(),str.end());return str;}
};