持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
字符串相加
题目链接:字符串相加
题目描述:给定两个字符串形式的非负整数 num1 和 num2,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger),也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
解题思路
当我们刚开始看到这个题目时,可能一下子会懵,不能直接将输入的字符串转化为整数形式,那该怎么解呢?
对于字符串相加等这一类型的题目,我们可以使用双指针的思路来进行解题。
思路如下:
首先创建
i指针和j指针,i指针指向num1末尾,j指针指向num2末尾。将
i,j指向的数字相加,进位就用carry来记录进位值,无则为0。若产生进位,则当前数字为
(i+j)%10的值。若在遍历过程中,
nums1或nums2当前已无数字,则用0进行补位来计算。
需要注意的地方:在进行相加的过程中,需要从低位开始进行相加,将单个字符转化为整数相加,题目告诉我们不能直接将字符串转化为整数,但我们可以通过 charAt() 方法获取指定位置的字符,并通过 -'0' 将单个字符转为整数或者也可以使用 Number,最后将结果反转输出即可。
题解
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var addStrings = function(num1, num2) {
let i = num1.length - 1;
let j = num2.length - 1;
let carry = 0;
const res = [];
while (i >= 0 || j >= 0 || carry !== 0) {
let c1 = i >= 0 ? num1.charAt(i) - '0' : 0;
let c2 = j >= 0 ? num2.charAt(j) - '0' : 0;
let sum = c1 + c2 + carry;
res.push(sum % 10);
carry = Math.floor(sum / 10);
i--;
j--;
}
return res.reverse().join('');
};
时间复杂度:,n1, n2 分别为 num1, num2 的长度,取较大位数
空间复杂度:
总结
此篇文章记录了笔者在 leetcode 刷题时的一些思考,在遇到字符串进行相加等这一类型的题目时,使用双指针的方法再合适不过了,既然整体不能转为整数形式,那就转化思想,将单个字符转为整数进行相加来解决,希望此文章能够为大家提供一些帮助,如有不足欢迎大家指出。谢谢!