难度简单
给定两个字符串形式的非负整数 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
都不包含任何前导零
思路:
1. 模拟手写加法
2.indexI, indexJ分别从两个数的最后面开始
3.while循环条件:carry不为0,或者 indexI, indexJ 没到头,就一直循环
解答:
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var addStrings = function(num1, num2) {
// 模拟手写加法,即:
// 模拟「竖式加法」
// 两个指针从后往前
let lastI = num1.length - 1;
let lastJ = num2.length - 1;
// console.log(`${lastI} - ${lastJ}`);
// 进位
let carry = 0;
let res = [];
// 3者之一(有进位,或者 num1 num2的指针 还没移动到 首位)
while(lastI >= 0 || lastJ >= 0 || carry !== 0) {
// 优化点:当下标为负数的时候,直接返回 0
let a = num1.charAt(lastI) - '0';
let b = num2.charAt(lastJ) - '0';
let sum = a + b + carry;
// console.log(`${a} + ${b} = ${sum}`);
let mod = sum % 10;
res.push(mod);
carry = Math.floor(sum / 10);
// 利用完最后一位,指针前移
lastI--;
lastJ--;
}
// console.log(res);
return res.reverse().join('');
};