题意:
- 用两个字符串表示两个数
- 求出其相加的结果
- 不能使用任何内建 BigInteger 库
- 不能直接将输入的字符串转换为整数形式
思路:
- 翻转字符串,将其转为字符数组,即从下标0开始依次表示数的个位、十位、百位…
- while循环外初始化一个add变量来记录进位数,StringBuilder来添加每次循环时每位数字运算完后的结果
- 执行while循环的最后一个条件必须是add != 0,保证数的最后一位运算完后仍有进位时能继续执行循环进行运算后添加到StringBuilder中
- 建立x, y 变量,结合三目运算符用来处理字符数组越界的情况
- 每次循环每位数字的运算公式:num = x + y + add (对位数字相加后再加上前一位计算结果的加数)
- StringBuilder每次只添加num % 10(num进位后的结果,num<10的话是其本身)
- 计算加数:num/10
class Solution {
public static String addStrings(String num1, String num2) {
StringBuilder ans = new StringBuilder();
// p1指向num1尾部,p2指向num2尾部
int p1 = 0, p2 = 0;
// 进位数
int add = 0;
// 字符串翻转后转为字符数组
char[] c1 = new StringBuilder(num1).reverse().toString().toCharArray();
char[] c2 = new StringBuilder(num2).reverse().toString().toCharArray();
while (p1 < num1.length() || p2 < num2.length() || add != 0) {
// 只要指针越界了数字就当作0
int x = p1 < num1.length() ? c1[p1] - '0' : 0;
int y = p2 < num2.length() ? c2[p2] - '0' : 0;
int num = x + y + add;
ans.append(num % 10);
add = num / 10;
p1++;
p2++;
}
return ans.reverse().toString();
}
}
收获
-
对字符串表示的数进行逢十进一的处理:
- 翻转字符串,将其转为字符数组,即从下标0开始依次表示数的个位、十位、百位…
- while循环外初始化一个add变量来记录进位数,StringBuilder来添加每次循环时每位数字运算完后的结果
- 执行while循环的最后一个条件必须是add != 0,保证数的最后一位运算完后仍有进位时能继续执行循环进行运算后添加到StringBuilder中
- 建立x, y 变量,结合三目运算符用来处理字符数组越界的情况
- 每次循环每位数字的运算公式:num = x + y + add (对位数字相加后再加上前一位计算结果的加数)
- StringBuilder每次只添加num % 10(num进位后的结果,num<10的话是其本身)
- 计算加数:num/10
-
while和逻辑或
||
结合:两个指针都扫描完其所在范围的数组后才停止循环 -
char类型中只有`0`~`9`的字符,对应的编码为48 ~ 57,如果想把字符的数字内容提取提取出来为int,可以用相应字符减去`0`对应的偏移量即为int类型数字