1. 题目链接:415. 字符串相加
2. 题目描述:
给定两个字符串形式的非负整数
num1
和num2
,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如
BigInteger
), 也不能直接将输入的字符串转换为整数形式。示例 1:
输入:num1 = "11", num2 = "123" 输出:"134"
示例 2:
输入:num1 = "456", num2 = "77" 输出:"533"
示例 3:
输入:num1 = "0", num2 = "0" 输出:"0"
提示:
1 <= num1.length, num2.length <= 104
num1
和num2
都只包含数字0-9
num1
和num2
都不包含任何前导零
3. 解法:
3.1 算法思路:
- 首先,获取两个输入字符串的长度,分别存储在变量x1和x2中。
- 初始化一个空字符串s,用于存储结果。
- 初始化一个变量val,用于记录进位。
- 使用while循环进行以下操作,直到x1、x2都小于0且val等于0为止:
- 判断x1是否大于等于0,如果是,则将num1[x1]减去字符’0’,得到y1的值;否则,将y1设为0。
- 判断x2是否大于等于0,如果是,则将num2[x2]减去字符’0’,得到y2的值;否则,将y2设为0。
- 将y1、y2和val相加,得到num的值。
- 将num除以10取余数,加上字符’0’,得到当前位的数字,并将其添加到字符串s的末尾。
- 将num除以10取整,更新val的值。
- 将x1和x2的值减1,以便处理下一位数字。
- 使用reverse函数将字符串s反转,使其按照正确的顺序排列。
- 返回字符串s作为结果。
这个算法的思路是通过逐位相加的方式,将两个字符串表示的整数相加。在每次循环中,从字符串的末尾开始,依次取出每一位数字,并将其与进位值相加,得到当前位的结果。然后将结果除以10取余数,得到当前位的数字,并将其添加到结果字符串中。最后,将结果字符串反转,得到最终的相加结果。
3.2 C++算法代码:
class Solution {
public:
// 定义一个函数addStrings,接收两个字符串参数num1和num2,返回一个字符串
string addStrings(string num1, string num2) {
// 获取num1和num2的长度减1,分别赋值给x1和x2
int x1=num1.length()-1;
int x2=num2.length()-1;
// 定义一个空字符串s,用于存储结果
string s="";
// 定义一个变量val,初始值为0,用于记录进位
int val=0;
// 当x1大于等于0、x2大于等于0或val不等于0时,执行循环
while(x1>=0||x2>=0||val!=0)
{
// 如果x1大于等于0,则将num1[x1]减去字符'0'的值赋给y1;否则,将y1设为0
int y1=x1>=0?num1[x1]-'0':0;
// 如果x2大于等于0,则将num2[x2]减去字符'0'的值赋给y2;否则,将y2设为0
int y2=x2>=0?num2[x2]-'0':0;
// 将y1、y2和val相加,得到当前位的结果
int num=y1+y2+val;
// 将当前位的结果除以10取余数,加上字符'0',然后添加到字符串s的末尾
s.push_back(num%10+'0');
// 将当前位的结果除以10取整,赋值给val
val=num/10;
// x1和x2都减1,以便处理下一位数字
x1--;
x2--;
}
// 将字符串s反转,使其按照正确的顺序排列
reverse(s.begin(),s.end());
// 返回字符串s作为结果
return s;
}
};