415. 字符串相加(简单)
方法一
思路
这道题很简单,我们知道,如果对两个数相加,那么需要对位相加,为了方便对位,我们可以对长度较小的字符串前面补 0,使得 num1
和 num2
长度相等。
比如 123
和 11
,经过补0后得到 123
和 011
。
为了方便补 0,我们首先交换 num1
和 num2
,确保长度较长的数在前面,固定对 num2
补 0 。
对位相加的时候,我们需要注意两个数字相加是否会发生进位 。如果产生进位,那么就设置 add = 1 ,否则 add = 0 。
因此,对位相加的公式即 sum = num1[i] - '0' + num2[i] - '0' + add;
最后,还需要对最高位的进位情况 进行特殊判断,是否在最高位还需要补 1 。
代码
class Solution {
public:
string addStrings(string num1, string num2) {
int n1 = num1.size(), n2 = num2.size();
if(n1 < n2){
// 确保num1长度更长
string temp;
temp = num2, num2 = num1, num1 = temp;
}
// 更新字符串长度
n1 = num1.size(), n2 = num2.size();
// 对num2的字符串前面补0
while(n2 < n1){
num2.insert(0, "0");
++ n2;
}
string ans;
int add = 0;
// 从低位开始相加
for(int i=n1-1; i>=0; --i){
int sum = num1[i] - '0' + num2[i] - '0' + add;
sum >= 10 ? add = 1 : add = 0;
ans.insert(0, to_string(sum % 10));
}
// 最高位的特判
if(add == 1) ans.insert(0, "1");
return ans;
}
};
方法二
思路
因为相加运算是从后往前进行,所以可以先翻转字符串 ,再逐位计算。这种类型的题考察的是细节,比如进位、位数差。