2023-07-17每日一题
一、题目编号
415. 字符串相加
二、题目链接
三、题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
提示:
- 1 <= num1.length, num2.length <= 104
- num1 和num2 都只包含数字 0-9
- num1 和num2 都不包含任何前导零
四、解题代码
class Solution {
public:
string addStrings(string num1, string num2) {
string s;
int m = num1.size();
int n = num2.size();
int i = m - 1, j = n - 1;
int carry = 0;
while(i >= 0 && j >= 0){
int num = carry + (num1[i] - '0') + (num2[j] - '0');
s += char(num % 10 + '0');
carry = num / 10;
--i;
--j;
}
while(i >= 0){
int num = carry + (num1[i] - '0');
s += char(num % 10 + '0');
carry = num / 10;
--i;
}
while(j >= 0){
int num = carry + (num2[j] - '0');
s += char(num % 10 + '0');
carry = num / 10;
--j;
}
if(carry != 0){
s += '1';
}
reverse(s.begin(), s.end());
return s;
}
};
五、解题思路
(1) 本道题目来源于高精度加法,如果两个数字十分之大,无论是int还是long long都无法解决问题。那么就需要转化成字符串相加的形式才能够解决实质性的问题。那么如何用字符串来模拟呢?
(2) 我们在小学的时候就已经学习过列竖式相加。用一个最简单的例子证明,1+9,那么等于10,个位为(1 + 9)% 10,进位位为(1 + 9) / 10。
(3) 所以我们需要诸位相加,利用上述的思路来进行解决问题。我们用双指针来遍历两个字符,i来遍历字符串num1,j来遍历字符串num2。因为字符串最后是个位,所以要倒序遍历,知道哪一个指针到达下标为0,这个时候需要将剩余没有加完的字符串加完。最后一定要注意,一定要将没有加完的进位位加上(如果为0不加)。
(4) 最后注意翻转字符串将高位移动到前面即可。