算法系列-第三题

67 阅读1分钟

题目名称:字符串相加(大数加法)

给定两个字符串形式的非负整数  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("");

}