415. 字符串相加

给定两个非负整数字符串 num1num2,返回它们的和(字符串)。数字可能超大,不能直接 Number() 转换(会溢出 Number.MAX_SAFE_INTEGER)。

考点:模拟竖式加法(双指针从尾到头逐位相加 + 进位)。

var addStrings = function (num1, num2) {
  let i = num1.length - 1, j = num2.length - 1, carry = 0
  const res = []
  while (i >= 0 || j >= 0 || carry) {
    const n1 = i >= 0 ? num1.charCodeAt(i--) - 48 : 0  // -48 等价于 -'0'.charCodeAt(0)
    const n2 = j >= 0 ? num2.charCodeAt(j--) - 48 : 0
    const cur = n1 + n2 + carry
    res.push(cur % 10)          // 当前位
    carry = (cur / 10) | 0      // 进位(位运算取整,比 Math.floor 快)
  }
  return res.reverse().join('')
}

复杂度:时间 / 空间均 O(max(m, n))

易错点

  • 循环条件别漏 || carry,否则末尾还有进位时会少进一位(如 "99" + "1");
  • 短的字符串遍历完后补 0i >= 0 ? ... : 0);
  • charCodeAt - 48Number(char) 更省一次转换;
  • 别用 BigInt(num1) + BigInt(num2) 投机,面试不认,逐位模拟才是考点。

关键套路一句话:字符串大数运算 = 双指针从尾向头、%10 取位、/10 进位、循环带上末尾进位。

举一反三LeetCode Hot100 杂题 中的大数类题、字符串相乘(43)。