leetCode 415 Add Strings
本来这道题很简单,但是由于个人菜鸟提交了好几次才有通过~
public class Solution {
public String addStrings(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
if (len1 == 0||num1.equals("0")) return num2;
if (len2 == 0||num2.equals("0")) return num1;
StringBuilder res=new StringBuilder();
StringBuilder residualString=new StringBuilder();
int i = 0, j = 0,carry = 0;//进位。
for (i = len1 - 1, j = len2 - 1; i >=0 && j >=0; i--, j--) {
int a = num1.charAt(i) - '0';
int b = num2.charAt(j) - '0';
if (a + b +carry> 9) {
residualString.append((a + b+ carry) % 10 );
carry = 1;
} else {
residualString.append(a + b + carry);
carry=0;
}
}
if (i <0) {//len1小
residualString.append(postDeal(num2.substring(0,j+1), carry));
}
else{
residualString.append(postDeal(num1.substring(0,i+1), carry));
}
for(i=residualString.length()-1;i>=0;i--){
res.append(residualString.charAt(i));
}
return res.toString();
}
String postDeal(String num,int carry){
String res="";
if(carry==0){
for(int i=num.length()-1;i>=0;i--){
res+=num.charAt(i);
}
return res;
}
else{
for(int i=num.length()-1;i>=0;i--){
int a=num.charAt(i)-'0';
if(a+carry<=9){
res+=(a+carry);
// res+=num.substring(0,i);
carry=0;
// break;
}
else{
carry=1;
res+='0';
}
}
if(carry==1)
res+="1";
return res;
}
}
}
代码写的并不简洁,甚至说是臃肿,贴在这里给自己个警钟,
1、最后的进位,
2、本来是想先把长的字符串的高位部分取出来,传到另一个参数做后 处理,结果没有考虑到两个字符串相同的情况;
3、在后处理时,想着简介一些,进位carry=0即可不用继续计算,然后没有翻转直接追加到了结果串上面去,最后翻转结果出错。
4、StringBuffer 有一个reverse()函数,直接翻转,不必自己写。
最后附上简洁的代码做个比较:(瞬间感觉世界都清净了)
public String addStrings(String num1, String num2) {
int carry=0;
StringBuffer sb=new StringBuffer();
for(int i=num1.length()-1,j=num2.length()-1;i>=0||j>=0||carry==1;i--,j--){
int a=0,b=0;
if(i>=0) a=num1.charAt(i)-'0';
if(j>=0) b=num2.charAt(j)-'0';
sb.append((a+b+carry)%10);
carry=(carry+a+b)/10;
}
return sb.reverse().toString();
}