415. Add Strings

26 年 3 月 5 日 星期四
464 字
3 分钟

415. Add Strings

Screenshot 2026-03-05 at 11.39.43 am

⚠️重点是怎么处理carry

js
/**
 * 字符串形式的非负整数相加(模拟大数加法,避免数值溢出)
 * @param {string} num1 - 第一个数字字符串(仅包含 0-9 的字符)
 * @param {string} num2 - 第二个数字字符串(仅包含 0-9 的字符)
 * @return {string} 两个数字相加后的结果字符串
 */
var addStrings = function (num1, num2) {
  // 初始化结果字符串
  let res = ''
  // 定义三个变量:
  // i: 指向 num1 最后一个字符的指针(从末尾开始遍历)
  // j: 指向 num2 最后一个字符的指针
  // carry: 进位值(初始为 0,例如 9+9=18,进位为 1)
  let i = num1.length - 1,
    j = num2.length - 1,
    carry = 0

  // 循环条件:只要 num1 或 num2 还有未处理的字符,或还有进位,就继续计算
  // (i >= 0 处理 num1 剩余字符,j >= 0 处理 num2 剩余字符)
  while (i >= 0 || j >= 0) {
    // 取出 num1 当前位的数字:如果 i >= 0 则取对应字符转数字,否则补 0
    const n1 = i >= 0 ? parseInt(num1[i]) : 0
    // 取出 num2 当前位的数字:逻辑同 n1
    const n2 = j >= 0 ? parseInt(num2[j]) : 0

    // 计算当前位的总和:n1 + n2 + 上一轮的进位
    const tmp = n1 + n2 + carry
    // 更新进位:总和除以 10 取整(例如 18//10=1,9//10=0)
    carry = Math.floor(tmp / 10)
    // 计算当前位的结果:总和对 10 取余(例如 18%10=8,9%10=9)
    // 注意:要把当前位结果拼在 res 前面(因为是从后往前计算)
    res = (tmp % 10) + res

    // 指针向前移动一位,处理前一位的数字
    i--
    j--
  }

  // 循环结束后,如果还有进位(例如 999 + 1 = 1000),需要在结果前补 1
  // 否则直接返回结果字符串
  return carry ? '1' + res : res
}

文章标题:415. Add Strings

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/415_add_strings[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。