题目描述:给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。进阶:你能否仅使用O(1) 空间解决问题?
注意:
- 所有字符都有一个ASCII值在
[35, 126]
区间内。 1 <= len(chars) <= 1000
。
解题思路:空间复杂度为O(1)考虑原地改变,使用指针read和write分别进行标记和写相同字符序列,利用pos记录相同字符序列的首元素,如果遇见相同字符,则进行read++,整个read移动的距离(read-pos+1
)即为相同字符序列的长度。
具体实现:
class Solution {
public int compress(char[] chars) {
int pos = 0;
int write = 0;
for (int read = 0; read < chars.length; read++) {
if (read + 1 == chars.length || chars[read + 1] != chars[read]) {
chars[write++] = chars[pos];//将相同字符序列的首元素记录下来
if (read > pos) {
//向结果中加入相同字符序列的长度的字符形式
for (char c: ("" + (read - pos + 1)).toCharArray()) {
chars[write++] = c;
}
}
pos = read + 1;
}
}
return write;
}
}