#415
简单
高频
迭代法字符串相加
这是一道围绕字符串展开的高频练习。建议先掌握「迭代法」这套写法,再结合下方步骤讲解理解状态维护、边界处理和复杂度取舍。
字符串
题目分析
这道题表面上是在处理「字符串相加」,但先要想清楚题目到底让你返回什么,以及过程中哪些约束必须一直满足。从题型上看,它主要在考 字符串 这些能力。这类题通常不难想到总体方向,真正容易乱的是遍历顺序、边界收缩和状态更新的先后关系。只有先把题目要求翻译成人话,后面的推荐代码才是在实现思路,而不是直接给答案。
接下来怎么看推荐代码: 带着这个理解再看推荐代码时,重点观察这条主线:从两个字符串尾部开始逐位相加,带上进位,最后把结果反转回来。
推荐代码
推荐解法:迭代法
时间复杂度: O(max(m,n))
空间复杂度: O(max(m,n))
核心思路: 从两个字符串尾部开始逐位相加,带上进位,最后把结果反转回来。
class Solution {
/**
* 字符串相加算法
* 使用迭代方法实现两个字符串表示的非负整数相加
*/
public String addStrings(String num1, String num2) {
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
StringBuffer ans = new StringBuffer();
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1.charAt(i) - '0' : 0;
int y = j >= 0 ? num2.charAt(j) - '0' : 0;
int result = x + y + add;
ans.append(result % 10);
add = result / 10;
i--;
j--;
}
// 计算完以后的答案需要翻转过来
ans.reverse();
return ans.toString();
}
}结构化讲解
面试时怎么讲
开场思路
这题我会按手算加法来做,从字符串尾部逐位相加。
核心过程
- 双指针分别从两个字符串末尾开始移动。
- 每轮取两个当前数字和进位做加法。
- 把个位写入结果,把十位更新成新的进位。
- 最后把反向构造的结果翻转回来。
复杂度总结
时间复杂度 O(max(m,n)),空间复杂度 O(max(m,n))。
面试补一句:这题最该强调的是“不要转整数”,而是按位模拟。
核心思路
字符串相加和手算加法完全一样。由于最低位在末尾,所以从尾部往前逐位计算最自然,进位贯穿整个过程。
步骤讲解
1
双指针从尾部向前扫描
分别从两个字符串最后一位开始,逐步向前取数字。
为什么这样做:加法从低位开始,尾部正好是最低位。
对应代码提示:int i = num1.length() - 1, j = num2.length() - 1;
2
每一位加上进位一起计算
当前位和等于两个数字加上上一轮进位,个位写入结果,十位留作新进位。
为什么这样做:进位是多位加法的核心状态,不能丢。
对应代码提示:int sum = x + y + carry;
3
结果构造完成后反转
因为是从低位到高位依次追加,所以最后要反转得到正常顺序。
为什么这样做:输出字符串必须按高位到低位排列。
对应代码提示:return builder.reverse().toString();
易错点
试图先转整数再相加
题目就是为了避免大整数溢出,直接转数字会失去意义。
正确理解:按字符逐位处理,不依赖整型范围。
循环结束后忘记处理最终进位
像 999 + 1 这种情况会少一位。
正确理解:循环条件要把
carry != 0 也算进去。字符转数字时没减 `'0'`
会把 ASCII 码直接拿来参与运算,结果完全错误。
正确理解:统一用
ch - '0' 取数值。复杂度与适用判断
时间复杂度:O(max(m,n))
空间复杂度:O(max(m,n))
比其他方案更好在哪里:比依赖大整数库更通用,也更符合题目设计意图。
适用判断:字符串数字运算题里只要数位独立且有进位/借位,优先考虑从尾部逐位模拟。
额外提醒
- 进位和双尾指针,是这题唯一真正的状态。
动画演示
如果你还没完全看懂,可以展开动画演示。
迭代法动画演示
想看这段解法是怎么一步步运行的,可以展开动画继续观察。
迭代法动画演示
想看这段解法是怎么一步步运行的,可以展开动画继续观察。
准备就绪 - 输入两个字符串数字,然后点击开始
动画演示仅在桌面端提供,移动端请优先阅读推荐代码与结构化讲解。