题目
给定两个字符串形式的非负整数 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 <= 104num1和num2都只包含数字0-9num1和num2都不包含任何前导零
解析
题目明确要求不能使用任何库,以及直接将输入的字符串要求转换为整数形式。 因此可以采用双指针的方式,从后往前遍历字符串的每一个字符,并将每一位字符转为数字两两相加,即可得到它们计算和的字符。
具体步骤如下:
- 声明
i,j指针分别指向num1,num2的末尾 - 声明
curry保存当前进位 - 声明
res空串表示num1,num2表示计算和的字符串 - 从后往前遍历
num1,num2的每一个字符- 当
i >= 0或者j >= 0, 一直循环遍历 - 在每一轮遍历计算出
num1和num2的每一位和,并赋值给curry - 对
curry % 10取余数得到当前位数, 拼接到res上 - 对
Math.floor(curry / 10)得到进位值, 并更新curry - 指针
i,j减一, 向前遍历每一个字符 - 当
i < 0或者j < 0, 说明num1和num2已经遍历完成,终止循环
- 当
- 最后判断如果
curry > 0说明存在进位值,需要加上curry
参考代码
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var addStrings = function(num1, num2) {
// i 指向 num1 的 末尾,
let i = num1.length -1 ;
// j 指向 num2 的 末尾
let j = num2.length - 1;
// curry 表示当前进位
let curry = 0;
// res 存储 num1 和 num2 的 每一位相加之和的值
let res = '';
// 循环终止条件:i, j 不能越界
while (i >= 0 || j >= 0 ) {
const x = parseInt(num1[i] || 0);
const y = parseInt(num2[j] || 0);
curry = x + y + curry;
const mod = curry % 10;
res = mod + res;
curry = Math.floor(curry / 10);
// 遍历当前后,i, j 指针往前走
i--;
j--;
}
// 如果 curry > 0, 说明存在进位, 要加上curry;
return curry ? curry + res : res;
};