文章标题

来源:互联网 发布:股票买卖模拟软件 编辑:程序博客网 时间:2024/06/04 01:33

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();    }
0 0