題目描述
給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。
注意:
num1 和num2 的長度都小於 5100.
num1 和num2 都只包含數字 0-9.
num1 和num2 都不包含任何前導零。
你不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字符串轉換爲整數形式。
來源:力扣
鏈接:字符串相加
思路:
- 首先根據字符串 num1 和 num2的長度進行補位, 在長度較短的字符串前插字符’0’直至長度相等, 這一步操作可以方便我們利用for循環從字符串末尾逐位向前相加
- 設置進位 step 初始值爲 0, 用 string ret接收每一次結果, 第一步已經通過補齊操作使得num1, num2長度相等, 因此給利用 resize 給 ret 開好空間 ret.resize(num1.size());
即 ret[i] = (num1[i] - ‘0’) + (num2[i] - ‘0’) + step + '0;
若該字符 大於 '9’表示下次相加需要進位, 修改 step 爲 1
注意如果不大於字符 ‘9’, 要將step 置爲 0(防止之前因爲進位將step修改爲1, 因此如果不置0, 本來本次相加不需要加1, 但由於上次修改了step爲1導致本次相加多加了1) - 最後要注意, 當 ret[0] = (num1[0] - ‘0’) + (num2[0] - ‘0’) + step + '0 的結果大於字符 '9’時, 說明此時需要進位, 但for循環記錄本次 ret[0]的結果, 將step置爲1之後結束循環, 此時返回 ret就丟失了這個記爲值, 因此 for循環結束 再加一次判斷
即如果 step == 1的, 給 ret前插字符 ‘1’
代碼示例:
class Solution {
public:
string addStrings(string num1, string num2) {
//根據num1和num2的長度進行補位操作
int len1 = num1.size();
int len2 = num2.size();
int count = abs(len1 - len2);
if (len1 > len2)
num2.insert(0, count, '0');
else if (len1 < len2)
num1.insert(0, count, '0');
int len = num1.size();
string ret;//作返回值
ret.resize(len);//開好空間,方便下標訪問對應值
int step = 0;//表示進位
for (int i = len - 1; i >= 0; --i)
{
ret[i] = (num1[i] - '0') + (num2[i] - '0') + step + '0';
if (ret[i] > '9')//大於字符'9', 即需要進位
{
ret[i] -= 10;
step = 1;
}
else
step = 0;
}
if (step == 1)
ret.insert(0, 1, '1');
return ret;
}
};