给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
因为是字符串表示的数字,且根据题目描述,不存在前导0和其他字符,因此这一题应当是把字符串当作数字来相加的。
因为前边做过一个链表数字相加的题,当时的思路和这个差不多,只不过这个是从后往前加。
上一个题,做的时候将相加和进位分离处理了,徒增了时间复杂度,这一次自然记住了需要维护一个进位变量。
所以,思路就是同时从尾部向前遍历两个字符串,每一位相加,而且要加上进位变量,并保留个位,进位为相加后的十位(0或1)。直到某一个字符串遍历完毕(将另一个字符串剩余的部分加上去,而且不能忘记加进位变量)或者两者都遍历完毕,退出循环。
因为最后一位有可能有进位,比如90+10=100就是9+1=10,进了一位。
因此在退出循环后,要检查进位变量是否是0,如果不是就说明进位了,需要再加一个进位。
想要计算每一个字符的和,需要先转化成数字再相加,最简单的方法就是字符-‘0’,也就是直接使用编码差来得到其正确的数值
#include
using namespace std;
class Solution {
public:
string addStrings(string num1, string num2) {
// 维护一个进位变量
int upper = 0;
string add_str = "";
// 加法,所以要从尾部字符开始计算
for (int index1 = num1.length()-1, index2 = num2.length()-1; index1 >= 0 || index2 >= 0; index1--,index2--)
{
int t;
// 检查是否有一个字符串已经结束了
if (index1 < 0)
{
// 字符串1已经结束了
t = num2[index2] - '0' + upper;
}
else if (index2 < 0)
{
// 字符串2已经结束了
t = num1[index1] - '0' + upper;
}
else
{
// 逐位相加,还要加上进位变量
t = num1[index1] - '0' + num2[index2] - '0' + upper;
}
upper = t / 10;
add_str = std::to_string(t % 10) + add_str;
}
if (upper > 0) add_str = std::to_string(upper) + add_str;
return add_str;
}
};
其思想和我的上述方法基本一致,只不过对于长短不一的情况,采取了补0的方法而不是添加判断:
我们定义两个指针 ii 和 jj 分别指向 \textit{num1}num1 和 \textit{num2}num2 的末尾,即最低位,同时定义一个变量 \textit{add}add 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 00,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
string ans = "";
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int result = x + y + add;
ans.push_back('0' + result % 10);
add = result / 10;
i -= 1;
j -= 1;
}
// 计算完以后的答案需要翻转过来
reverse(ans.begin(), ans.end());
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-strings/solution/zi-fu-chuan-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题都是不白做的,每次和答案有一定的出入的时候,都会有印象并带入下次可能需要的算法中去,这也算是一个经验。
每日打卡完成!