携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
一、题目描述:
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
提示:
- 1 <= num1.length, num2.length <= 10^4
- num1 和num2 都只包含数字 0-9
- num1 和num2 都不包含任何前导零
二、思路分析:
整体思路:字符串转为字符数组,每个字符转为数字来模拟两个数字相加的过程。
注意点
- 数字字符取对应的数字 可以直接charNums[i] - '0';
- 从后向前遍历,双指针分别从两个数组的末尾开始,当数组长度不一致时,肯定有指针先指到负数,这里直接赋0
- index遍历到0的时候,这时候直接将sum值加到字符串开头,而不是sum % 10。
- 字符串拼接可以直接拼接,也可以调用StringBuilder的insert(index, int) api 在index位置加上int的字符串形式。
三、AC 代码:
class Solution {
public String addStrings(String num1, String num2) {
// 思路:转为字符数组模拟加法的过程
char[] n1 = num1.toCharArray();
char[] n2 = num2.toCharArray();
int index = Math.max(n1.length - 1, n2.length -1);
// 双指针去操作字符数组
int left = n1.length -1 ;
int right = n2.length -1;
// 进位模拟相加
int extra = 0;
// 指针对应的数字 溢出位在循环中处理0
int ln = 0;
int rn = 0;
// 倒序遍历模拟加法
// StringBuilder sb = new StringBuilder();
String ans = "";
for (int i = index; i >=0; i--) {
ln = left <0 ? 0 : n1[left] - '0';
rn = right < 0 ? 0 : n2[right] - '0';
int sum = ln + rn + extra;
// 进位滚动更新
extra = sum / 10;
// 在结果字符串0的位置插入算出来的数字 最后的时候进位要直接展示
// sb.insert(0, index != 0 ? sum % 10 : sum);
ans = String.valueOf(index != 0 ? sum % 10 : sum) + ans;
// 指针更新
index -- ;
left--;
right--;
}
// return sb.toString();
return ans;
}
}