题目名称:字符串相加(大数加法)
给定两个字符串形式的非负整数 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都不包含任何前导零
/**
* 解法一:模拟法(双尾指针法)
* 思路:模拟我们日常加法进位过程,详细过程看代码
* 时间复杂度:O(n),其中 n 为较长字符的长度,遍历字符串
* 空间复杂度:O(1),常数级空间
*/
function addStrings(num1, num2): string {
if (num1.length === 0) return num2;
if (num2.length === 0) return num1;
const res = [];
let plus = 0;
let i = num1.length - 1; // i 指向num1尾部
let j = num2.length - 1; // j 指向num2尾部
while (i >= 0 || j >= 0 || plus !== 0) {
const sVal = i >= 0 ? parseInt(num1[i]) : 0;
const tVal = j >= 0 ? parseInt(num2[j]) : 0;
const sum = sVal + tVal + plus;
const cur = sum % 10; // 计算当前位(求余)
res.unshift(cur + ""); // 将数字转字符串插入res头部
plus = sum >= 10 ? 1 : 0; // 暂存进位,下次循环用到
i--;
j--;
}
return res.join("");
}