1. 程式人生 > >LeetCode演算法題-Add Strings(Java實現)

LeetCode演算法題-Add Strings(Java實現)

這是悅樂書的第223次更新,第236篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第90題(順位題號是415)。給定兩個非負整數num1和num2表示為字串,返回num1和num2的總和。

注意:

  • num1和num2的長度均<5100。
  • num1和num2都只包含數字0-9。
  • num1和num2都不包含任何前導零。
  • 您不能使用任何內建BigInteger庫或直接將輸入轉換為整數。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

從後向前依次獲取兩個字串的字元,轉成int型別,然後做加法得到和,利用對10取餘將餘數新增進字串的第一位,然後需要計算進位,直接將和除以10,就是可能存在的進位。

在迴圈的判斷條件中,還需要判斷進位是否等於1,因為有可能最高位會存在進位,不然會存在誤差。

兩個字串的長度不能保證相等,所以索引從後往前遞減時,兩索引大於等於0是或的關係。

在通過索引取對應位置的字元時,也要判斷是否大於等於0,不滿足就取預設值0。

public String addStrings(String num1, String num2) {
    int len = num1.length()-1;
    int len2 = num2.length()-1;
    int count = 0;
    StringBuilder sb = new StringBuilder();
    for (int i=len, j=len2; i>=0 || j>=0 || count == 1; i--,j--) {
        int n = i >= 0 ? num1.charAt(i)-'0' : 0;
        int n2 = j >= 0 ? num2.charAt(j)-'0' : 0;
        int sum = n + n2 + count;
        sb.insert(0, sum%10);
        count = sum/10;
    }
    return sb.toString();
}

03 第二種解法

和第一種解法的思路一樣,只是將for迴圈換成了while迴圈,沒有始終在第一位插入,而是最後通過反轉完成。

public String addStrings2(String num1, String num2) {
    int i = num1.length()-1;
    int j = num2.length()-1;
    int carry = 0;
    StringBuilder sb = new StringBuilder();
    while (i>=0 || j>=0 || carry == 1) {
        int n = i >= 0 ? num1.charAt(i)-'0' : 0;
        int n2 = j >= 0 ? num2.charAt(j)-'0' : 0;
        int sum = n + n2 + carry;
        sb.append(sum%10);
        carry = sum/10;
        i--;
        j--;
    }
    return sb.reverse().toString();
}

04 小結

演算法專題目前已連續日更超過兩個月,演算法題文章90+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!