返回

剖析 LeetCode——字符串相加(JS实现)背后的算法巧思

前端

前言

在计算机科学领域,字符串相加问题可谓是初学者入门的基础题型之一。LeetCode 上的字符串相加问题要求我们编写一个函数,将两个字符串表示的非负整数相加并返回结果。看似简单的题目背后,却蕴藏着巧妙的算法设计和编程技巧。本文将带你深入剖析 LeetCode 上的字符串相加问题,通过 JavaScript 的实现,揭开算法背后的奥秘,让你对编程艺术有更深入的理解。

算法思想

字符串相加问题的本质是将两个数字字符串相加,并处理好进位的问题。为了解决这个问题,我们可以使用两个指针分别指向数字字符串的末尾位置,从右到左进行相加。在相加过程中,如果遇到进位的情况,则将进位记录下来,并在下一次相加中加上进位值。如此反复,直到两个指针都指向字符串的开头位置,此时累加的和即为最终结果。

JavaScript 实现

/**
 * 给定两个非负整数表示的字符串,返回其和。
 *
 * @param {string} num1 第一个非负整数字符串
 * @param {string} num2 第二个非负整数字符串
 * @returns {string} 两个整数之和的字符串表示
 */
const addStrings = (num1, num2) => {
  // 初始化变量
  let carry = 0; // 进位
  let result = ''; // 结果字符串
  let i = num1.length - 1; // 第一个字符串的指针
  let j = num2.length - 1; // 第二个字符串的指针

  // 循环相加
  while (i >= 0 || j >= 0 || carry) {
    // 获取两个字符串对应位置的数字
    const n1 = i >= 0 ? parseInt(num1[i], 10) : 0;
    const n2 = j >= 0 ? parseInt(num2[j], 10) : 0;

    // 计算和并处理进位
    const sum = n1 + n2 + carry;
    carry = Math.floor(sum / 10);
    result = (sum % 10) + result;

    // 移动指针
    i--;
    j--;
  }

  // 返回结果
  return result;
};

代码解析

变量初始化

在代码开始,我们首先初始化了三个变量:

  • carry:用于记录进位。
  • result:用于存储结果字符串。
  • i 和 j:分别指向 num1 和 num2 字符串的末尾位置。

循环相加

接下来,我们进入循环相加阶段。循环的条件是:i 或 j 大于等于 0,或者进位 carry 不等于 0。这意味着只要任何一个字符串还有未处理的数字,或者有进位需要处理,循环都会继续进行。

计算和并处理进位

在循环中,我们首先获取两个字符串对应位置的数字 n1 和 n2。然后计算它们的和并加上进位 carry,得到 sum。接下来,我们将 sum 分解为个位数和进位。个位数被添加到 result 字符串的开头,进位被存储在 carry 变量中。

移动指针

最后,我们将指针 i 和 j 同时向左移动一位,继续处理下一个位置的数字。

返回结果

循环结束后,我们将 result 字符串反转过来,以得到最终的相加结果。

结语

LeetCode 上的字符串相加问题看似简单,但它却蕴含着巧妙的算法思想和编程技巧。通过 JavaScript 的实现,我们一步步剖析了算法的逻辑,领略了编程艺术的魅力。希望本文能够帮助你加深对算法和编程的理解,并激励你不断探索计算机科学的奥秘。