题目:给定两个字符串形式的非负整数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都不包含任何前导零
1. 思考
对两个数字字符串模拟竖式加法的过程。低位对齐,由低位向高位逐位相加,当前位和超过10则向高位进一。
具体实现方式,定义两个索引i和j,分别指向num1和num2的低位,同时定义一个add记录当前的进位信息,然后从低位到高位依次相加即可。
2. 代码实现
public String addStrings(String num1, String num2) {
// index1指向num1最低位索引
int index1 = num1.length() - 1;
// index2指向num2最低位索引
int index2 = num2.length() - 1;
// add维护当前进位信息最低位无需进位,初始为0
int add = 0;
// StringBuilder维护从低到高位结果,最后需要逆序输出
StringBuilder sb = new StringBuilder();
// 只要存在未计算位数就一直计算
while (index1 >= 0 || index2 >= 0 || add > 0) {
// num1的低位数,越界情况返回0参与计算
int digit1 = index1 >= 0 ? num1.charAt(index1) - '0' : 0;
// num2的低位数,越界情况返回0参与计算
int digit2 = index2 >= 0 ? num2.charAt(index2) - '0' : 0;
// 当前位总和
int sum = digit1 + digit2 + add;
// 当前位结果
int digitResult = sum % 10;
// 添加到结果串
sb.append(digitResult);
// 是否向下一位进位
add = sum / 10;
// index1和index2向高位移动
index1--;
index2--;
}
sb.reverse();
return sb.toString();
}