天天看點

日常記錄——leetcode- 字元串相加

題目:

給定兩個字元串形式的非負整數 num1 和num2 ,計算它們的和。

提示:

num1 和num2 的長度都小于 5100

num1 和num2 都隻包含數字 0-9

num1 和num2 都不包含任何前導零

你不能使用任何內建 BigInteger 庫, 也不能直接将輸入的字元串轉換為整數形式

題解:

public String addStrings(String num1, String num2) {
        StringBuilder result = new StringBuilder();
        StringBuilder sa = new StringBuilder(num1);
        sa = sa.reverse();
        StringBuilder sc = new StringBuilder(num2);
        sc = sc.reverse();
        int length = num1.length()>num2.length()?num1.length():num2.length();
        //追加位數
        if(num1.length()<length){
            for (int i = 0; i < length-num1.length(); i++) {
                sa.append("0");
            }
        }
        if(num2.length()<length){
            for (int i = 0; i < length-num2.length(); i++) {
                sc.append("0");
            }
        }
        //記錄數值加和
        int sum = 0;
        for (int i = 0; i < length; i++) {
            sum = (sa.charAt(i)-'0')+(sc.charAt(i)-'0');
            //進位判斷  及 處理
            if(sum>=10){
                sum = sum%10;
                if(sa.length()>=sc.length()){
                    if(sa.length()<=i+1){
                        //超出範圍 直接最後一位進位  傳回
                        result.append(sum);
                        result.append(1);
                        break;
                    }else{
                        sa.setCharAt(i+1,(char)(sa.charAt(i+1)+1));
                    }
                 }else{
                    if(sc.length()<=i+1){
                        result.append(sum);
                        result.append(1);
                        break;
                    }else{
                        sc.setCharAt(i+1,(char)(sa.charAt(i+1)+1));
                    }
                }
            }
            result.append(sum);
        }
        return result.reverse().toString();
    }
           

優化後:

public String addStrings(String num1, String num2) {
        StringBuilder result = new StringBuilder();、
        //倒叙
        int s1index = num1.length()-1;
        int s2index = num2.length()-1;
        //記錄數值加和
        int sum = 0;
        while(s1index >= 0 || s2index >= 0 || sum!=0){
            if(s1index >= 0){
                sum += num1.charAt(s1index)-'0';
                s1index--;
            }
            if(s2index >= 0){
                sum += num2.charAt(s2index)-'0';
                s2index--;
            }
            //直接取模10
            result.append(sum%10);
            //将進位加到下次裡
            sum = sum/10;
        }
        return result.reverse().toString();
    }
           

執行效果:

日常記錄——leetcode- 字元串相加