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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!