1. 题目背景与核心需求
这道力扣算法题编号415,标题为"Add Strings",要求实现两个非负整数字符串的相加运算。乍看简单,实则暗藏多个需要处理的边界条件。与直接使用编程语言内置的大整数运算不同,题目要求我们手动模拟加法过程,这正是考察对基础算法的掌握程度。
字符串形式的数字相加在实际开发中并不少见。比如处理超过语言原生整数类型范围的超大数字(如银行系统的金额计算)、避免浮点数精度问题(如JavaScript中0.1+0.2≠0.3的情况)、或者处理来自前端的字符串格式数据时,都需要类似的技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计思路拆解
2.1 模拟竖式加法原理
核心思路是模拟小学生列竖式计算加法的过程:
- 从两个数字的最低位(字符串末尾)开始逐位相加
- 记录当前位的相加结果和进位值
- 将当前位结果存入最终结果
- 移动到前一位重复上述过程
这种方法的优势在于:
- 时间复杂度O(max(M,N)),M和N是两个字符串的长度
- 空间复杂度O(max(M,N)),只需存储结果字符串
- 不依赖任何语言特性,具有通用性
2.2 关键步骤分解
具体实现时需要处理以下关键点:
- 双指针初始化:分别指向两个字符串的末尾
- 进位carry初始化为0
- 循环条件:任一指针未到头或还有进位
- 当前位计算:
- 获取当前数字(指针有效则取值,否则为0)
- 计算sum = num1 + num2 + carry
- 当前位结果 = sum % 10
- 新进位 = sum // 10
- 结果拼接:注意顺序是逆序的,最后需要反转
3. 代码实现与逐行解析
以下是Python的完整实现方案:
python复制def addStrings(num1: str, num2: str) -> str:
i, j = len(num1)-1, len(num2)-1
carry = 0
res = []
while i >= 0 or j >= 0 or carry:
n1 = int(num1[i]) if i >= 0 else 0
n2 = int(num2[j]) if j >= 0 else 0
