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

LeetCode演算法題-String Compression(Java實現)

這是悅樂書的第230次更新,第242篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第97題(順位題號是443)。給定一組字元,就地壓縮它。壓縮後的長度必須始終小於或等於原始陣列。陣列的每個元素都應該是長度為1的字元(不是int)。在就地修改輸入陣列後,返回陣列的新長度。例如:

輸入:["a","a","b","b","c","c","c"]
輸出:返回6,輸入陣列的前6個字元應為:["a","2","b","2","c","3"]
說明:"aa"被"a2"取代。"bb"被"b2"取代。"ccc"被"c3"取代。

輸入:["a"]
輸出:返回1,輸入陣列的前1個字元應為:["a"]
說明:什麼都沒有被取代。

輸入:["a","b","b","b","b","b","b","b","b","b","b","b","b"]
輸出:返回4,輸入陣列的前4個字元應為:["a","b","1","2"]。
說明:由於字元"a"不重複,因此不會壓縮。 "bbbbbbbbbbbbb"被"b12"取代。請注意,每個數字在陣列中都有自己的條目。

注意:

  • 所有字元在[35,126]中都有ASCII值。
  • 1 <= len(字元)<= 1000。

跟進:你能用O(1)額外空間解決它嗎?

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

02 解題

此題我們需要做兩件事,一是將重複的字元進行替換,二是計算被替換後新陣列的長度。此題是不需要先將元素排序的,定義一個從0開始的索引,判斷當前元素是否是連續出現,如果是單個,直接使用新索引進行替換,如果是多次出現,把次數記錄下來,先將當前元素保留一個坑位,然後將出現的次數先變成字串,再變成字元陣列,緊跟著該元素後面進行替換,最後一次進行替換的索引就行新陣列的長度。

public int compress(char[] chars) {
    int sum = 0, index = 0;
    while (index < chars.length) {
        char current = chars[index];
        int num = 0;
        while (index < chars.length && chars[index] == current) {
            index++;
            num++;
        }
        chars[sum++] = current;
        if (num != 1) {
            for (char ch : (num+"").toCharArray()) {
                chars[sum++] = ch;
            }
        }
    }
    return sum;
}


03 小結

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

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