题目
来源:LeetCode.
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注:
1.num1 和num2 的长度都小于 5100
2.num1 和num2 都只包含数字 0-9
3.num1 和num2 都不包含任何前导零
4.不能使用任何內建 BigInteger 库,
也不能直接将输入的字符串转换为整数形式
看到这个问题我首先想到的方法就是十进制的加法。
接下来看一下解题思路:
思路一:
1.十进制加法是从各位开始加的,所以首先需要将字符串进行反转,这里通过StringBuder类里面的resvert()方法,实现字符串的反转。
2.每个位相加的时候可能会存在进位的情况,通过carry保存结果的十位,通过currentValue保存每一位相加的结果,包括进位;
3.如果两个字符串长度不一样,直接将剩余的加在结果的后面即可;
4.最后将结果反转返回;
代码示例:
class Solution {
public String addStrings(String num1, String num2) {
//因为后面要多次用到字符串长度,所以这里进行一次计算
int strLen1 = num1.length();
int strLen2 = num2.length();
if(strLen1 <= 0 || num1 == null) {
return num2;
}
if(strLen2 <= 0 || num2 == null) {
return num1;
}
//保存进位
int carry = 0;
//保存相加后的当前位
int currentValue = 0;
//用于保存计算后的结果
StringBuffer result = new StringBuffer();
//反转字符串
String string1 = String.valueOf(new StringBuffer(num1).reverse());
String string2 = String.valueOf(new StringBuffer(num2).reverse());
int i = 0;
for(; i < strLen1 || i < strLen2; i++) {
if(i >= strLen1) { //把较长的字符串直接加
currentValue = string2.charAt(i) - '0' + carry;
} else if(i >= strLen2) {
currentValue = string1.charAt(i) - '0' + carry;
} else {//因为是两个字符,所以需要减去两个'0'
currentValue = string1.charAt(i) + string2.charAt(i) - 2 * '0' + carry;
}
//保存进位
carry = currentValue / 10;
//保存结果的个位
currentValue %= 10;
result.append(currentValue);
}
//表示最后一位也存在进位
if(carry > 0) {
result.append(carry);
}
//将结果反转
return String.valueOf(result.reverse());
}
}
总结
上面用了三次字符串的反转,提交后,看了官方的解题步骤,发现人家只用了一次反转,而且代码干净整洁,果然还是自己太菜了。。。。。。。
思路二
1.将索引定位在字符串末尾;
2.依次从后往前遍历相加,用carry来保存进位;
3.如果遇到字符串长度不一样的,在短的前面补0;
4.最后将结果反转并返回;
代码示例:
class Solution {
public String addStrings(String num1, String num2) {
if("".equals(num1) || num1 == null) {
return num2;
}
if("".equals(num2) || num2 == null) {
return num1;
}
int carry = 0;
int i = num1.length() - 1;
int j = num2.length() - 1;
StringBuffer result = new StringBuffer();
while(i >= 0 || j >= 0 || carry != 0) {
//遇到长度不够的情况下补0
int a = (i < 0 ? 0 : num1.charAt(i--) - '0');
int b = (j < 0 ? 0 : num2.charAt(j--) - '0');
int add = a + b + carry;
//保存进位信息
carry = add / 10;
result.append(add % 10);
}
return result.reverse().toString();
}
}
总结
上面通过一次遍历一次字符串反转实现两个字符串相加。
补0这个操作很巧妙,学到了
本文介绍了两种在不使用内置库或整数转换的情况下,解决LeetCode字符串相加问题的方法。第一种方法通过三次字符串反转实现,第二种方法则优化为一次反转,并在较短字符串前补零。这两种解法均涉及字符串遍历、进位处理和字符转换。
204

被折叠的 条评论
为什么被折叠?



