给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
提示:
num1 和num2 的长度都小于 5100 num1 和num2 都只包含数字 0-9 num1 和num2 都不包含任何前导零 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式
我的思路: 1.2个字符串如果长度不一样,则对于短的字符串,前面进行0补位 2.从后面开始相加,因为要处理大于10进位问题,我之前按正序进行相加,就会出现进位出错问题 3.进位还有个问题,就是for循环结束了,第一位可能相加会大于10,这时候需要进位的,所以,需要还要把这个进行添加
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder builder = new StringBuilder();
int length1 = num1.length();
int length2 = num2.length();
if(length1>=length2){
num2 = append0(length1-length2,num2);
} else{
num1 = append0(length2-length1,num1);
}
int sum = 0;
for(int i=num1.length()-1;i>=0;i--){
int a1 = num1.charAt(i) - '0';
int a2 = num2.charAt(i) - '0';
int total = a1+a2+sum;
if(total>=10){
total = total%10;
sum = 1;
}else{
sum = 0;
}
builder.append(total+"");
}
if(sum!=0){
builder.append(sum+"");
}
return builder.reverse().toString();
}
private String append0(int n,String str){
StringBuilder builder = new StringBuilder();
for(int i=0;i<n;i++){
builder.append("0");
}
builder.append(str);
return builder.toString();
}
}
很明显,自己的写法,执行速度太慢,需要更高效的方式
于是回想其实补0的操作可以不用单独处理,于是有了如下代码,carry = sum/10还是处理比较精妙的
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder builder = new StringBuilder();
int length1 = num1.length()-1;
int length2 = num2.length()-1;
int carry = 0;
while(length1>=0||length2>=0){
int a1 = length1>=0?num1.charAt(length1)-'0':0;
int a2 = length2>=0?num2.charAt(length2)-'0':0;
int sum = a1 + a2 + carry;
builder.append(sum%10);
carry = sum/10;
length1--;
length2--;
}
if(carry!=0){
builder.append(1);
}
return builder.reverse().toString();
}
}