(Medium)
字符串chars中有连续出现的字母,当有连续出现的字母时,统计它出现的次数,
压缩成 “字母 + 次数”的格式,
只出现一次的不需要写次数,只写字母。
出现10次以上的,数字要分开写,比如Example3中的12, 要写成"1" 和 “2”.
不能新开辟数组写,要在原数组上写结果,返回有效长度。
思路:
感觉这个就靠观察,
需要几个变量:
1.当前字母的下标,
2.它出现的次数,
那么下次更新字母下标时直接用当前下标+次数。
3.当前字母,
4.写入位置的下标,
因为要在原数组上覆盖,所以要记录写入的位置,每写入一个字符下标要向右移一格。
public int compress(char[] chars) {
int n = chars.length;
if(n == 1) return 1;
char cur = chars[0]; //当前字母
int cnt = 1; //当前字母出现的次数
int curIdx = 0; //写入idx,每写入一个字符向右移动一格
int curCharIdx = 0; //指向当前字母的idx,+cnt即可跳到下一字母
for(int i = 1; i <= n; i++) {
if(i < n && chars[i] == chars[i-1]) cnt ++;
else {
chars[curIdx ++] = cur; //写入当前字母
//更新当前字母,写在这里是因为后面可能出现continue,保证能更新
curCharIdx += cnt; //下标跳到下一字母
if(curCharIdx < n) cur = chars[curCharIdx]; //当前字母更新
//写入当前字母出现的次数,1不需要写
if(cnt == 1) continue;
if(cnt < 10) chars[curIdx++] = (char)(cnt+'0');
else {
for(char c : (""+cnt).toCharArray()) {
chars[curIdx++] = c;
}
}
//更新cnt
cnt = 1;
}
}
return curIdx;
}