我的 leetcode 刷题记录--字符串相加

503 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

字符串相加

题目链接:字符串相加

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

你不能使用任何內建的用于处理大整数的库(比如 BigInteger),也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

解题思路

当我们刚开始看到这个题目时,可能一下子会懵,不能直接将输入的字符串转化为整数形式,那该怎么解呢?

对于字符串相加等这一类型的题目,我们可以使用双指针的思路来进行解题。

思路如下:

  1. 首先创建 i 指针和 j 指针,i 指针指向 num1 末尾,j 指针指向 num2 末尾。

  2. ij 指向的数字相加,进位就用 carry 来记录进位值,无则为 0

  3. 若产生进位,则当前数字为 (i+j)%10 的值。

  4. 若在遍历过程中,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('');
};

时间复杂度:O(max(n1,n2))O(max(n1, n2))n1, n2 分别为 num1, num2 的长度,取较大位数

空间复杂度:O(1)O(1)

总结

此篇文章记录了笔者在 leetcode 刷题时的一些思考,在遇到字符串进行相加等这一类型的题目时,使用双指针的方法再合适不过了,既然整体不能转为整数形式,那就转化思想,将单个字符转为整数进行相加来解决,希望此文章能够为大家提供一些帮助,如有不足欢迎大家指出。谢谢!