1. 题目背景与核心需求
"Add Strings"是力扣(LeetCode)平台上编号为415的算法题目,属于字符串处理类的基础题型。这道题看似简单,却涵盖了计算机科学中关于大数处理的经典问题场景。
题目要求我们模拟两个非负整数字符串相加的过程,并以字符串形式返回它们的和。例如:
- 输入:"123" + "456"
- 输出:"579"
这道题的核心价值在于解决了一个实际开发中的常见痛点:当数字超过语言内置类型的最大值时(如JavaScript的Number.MAX_SAFE_INTEGER为9007199254740991),直接使用数字类型进行计算会导致精度丢失。通过字符串模拟加法过程,我们可以处理任意长度的数字运算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法思路解析
2.1 手工加法模拟法
这道题最直观的解法就是模拟我们小学学过的竖式加法。具体步骤包括:
- 从两个字符串的末尾开始逐位相加
- 处理进位(carry)情况
- 将每位计算结果拼接成最终字符串
这种方法的优势在于:
- 时间复杂度O(max(M,N)),其中M和N是两个字符串的长度
- 空间复杂度O(max(M,N)),用于存储结果
- 不需要任何额外库支持,纯算法实现
2.2 边界情况处理
在实际编码中,需要特别注意以下边界情况:
- 两个字符串长度不等(如"123" + "4567")
- 最高位产生进位(如"999" + "1" = "1000")
- 输入包含前导零(虽然题目说明是非负整数,但实际工程中需要考虑)
- 空字符串输入(虽然题目保证非空,但防御性编程需要考虑)
3. 代码实现与逐行解析
以下是Python语言的完整实现,我们将逐行分析其工作原理:
python复制def addStrings(num1: str, num2: str) -> str:
res = []
carry = 0
i, j = len(num1) - 1, len(num2) - 1
while i >= 0 or j >= 0 or carry:
digit1 = int(num1[i]) if i >= 0 else 0
digit2 = int(num2[j]) if j >= 0 else 0
total = digit1 + digit2 + carry
carry = total // 10
res.append(str(total % 10))
i -= 1
j -= 1
return ''.join(reversed(res))
3.1 初始化部分解析
res = []:使用列表存储结果数字,因为字符串在Python中是不可变对象,频繁拼接效率低carry = 0:初始化进位值为0i, j:设置两个指针,分别指向两个字符串的末尾
3.2 主循环逻辑
循环条件i >= 0 or j >= 0 or carry确保了三种情况:
- num1还有未处理的数字
- num2还有未处理的数字
- 还有未处理的进位
3.3 数字获取与处理
digit1和digit2的获取使用了三元表达式处理不等长字符串total计算当前位的总和(包括进位)carry更新为total // 10(整除结果)res添加total % 10(取模结果)
3.4 结果处理
由于我们是按从低位到高位的顺序计算,最后需要通过reversed反转列表,再用join拼接成字符串。
4. 复杂度分析与优化空间
4.1 时间复杂度分析
算法的时间复杂度主要由while循环决定。最坏情况下需要遍历两个字符串的全部字符,因此时间复杂度为O(max(M,N)),其中M和N分别是两个输入字符串的长度。
4.2 空间复杂度分析
空间消耗主要来自:
- 结果列表res:最多存储max(M,N)+1个字符
- 其他变量:常数空间
因此空间复杂度也是O(max(M,N))。
