剖析 LeetCode——字符串相加(JS实现)背后的算法巧思
2024-01-27 03:22:13
前言
在计算机科学领域,字符串相加问题可谓是初学者入门的基础题型之一。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 的实现,我们一步步剖析了算法的逻辑,领略了编程艺术的魅力。希望本文能够帮助你加深对算法和编程的理解,并激励你不断探索计算机科学的奥秘。