问答题1140/1588字符串相加

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 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
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零
1/** 2 * @param {string} num1 3 * @param {string} num2 4 * @return {string} 5 */ 6var addStrings = function(num1, num2) { 7 8};
难度:
2022-05-11 创建

参考答案:

思路与算法

本题我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是如下图将相同数位对齐,从低到高逐位相加,如果当前位和超过 $10$,则向高位进一位?因此我们只要将这个过程用代码写出来即可。

预览

具体实现也不复杂,我们定义两个指针 ij 分别指向 num1num2 的末尾,即最低位,同时定义一个变量 add 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于 对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。

1var addStrings = function(num1, num2) { 2 let i = num1.length - 1, j = num2.length - 1, add = 0; 3 const ans = []; 4 while (i >= 0 || j >= 0 || add != 0) { 5 const x = i >= 0 ? num1.charAt(i) - '0' : 0; 6 const y = j >= 0 ? num2.charAt(j) - '0' : 0; 7 const result = x + y + add; 8 ans.push(result % 10); 9 add = Math.floor(result / 10); 10 i -= 1; 11 j -= 1; 12 } 13 return ans.reverse().join(''); 14};

复杂度分析

  • 时间复杂度:O(max(len1,len2)),其中 len1=num1.lengthlen2=num2.length。竖式加法的次数取决于较大数的位数。
  • 空间复杂度:O(1)。除答案外我们只需要常数空间存放若干变量。

最近更新时间:2024-01-24

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!