題目
給定一組字符,使用原地算法將其壓縮。
壓縮後的長度必須始終小於或等於原數組長度。
數組的每個元素應該是長度爲1 的字符(不是 int 整數類型)。
在完成原地修改輸入數組後,返回數組的新長度。
進階:
你能否僅使用O(1) 空間解決問題?
前言
此題要求使用原地算法求解,即將壓縮結果存在原chars[]數組中.
使用雙指針即可求解此題.這裏我們稱由相同字符組成的字符串爲相同字符序列.
指針t指示已壓縮的結果的末尾,指針i指示未壓縮字符串的開頭.
遇到相同的字符,指針i便向後滑動,直到遇到不同字符.指針i滑動的距離即爲相同字符序列的長度.
具體過程及解析如下:
public int compress(char[] chars) {
int t=0;//設置指針
int i=0;
while (i <chars.length && t<chars.length) {//遍歷字符串
chars[t++]=chars[i];//取相同字符序列的首字符存下
int temp=i;//記錄相同字符序列首元素位置
while (i<chars.length &&chars[i]==chars[t-1])
i++;//i指針滑動到相同字符序列末尾的下一個位置
if(i-temp>1){//若相同字符序列長度大於1
for(char c:String.valueOf(i-temp).toCharArray()){//向結果中加入相同字符序列的長度的字符形式
chars[t++]=c;
}
}
}
return t;//t即爲已壓縮的結果的長度
}