原题:
Given an array of characters, compress it in-place.
The length after compression must always be smaller than or equal to the original array.
Every element of the array should be a character (not int) of length 1.
After you are done modifying the input array in-place, return the new length of the array.
Follow up:
Could you solve it using only O(1) extra space?
Example 1:
Input: ["a","a","b","b","c","c","c"] Output: Return 6, and the first 6 characters of the input array should be: ["a","2","b","2","c","3"] Explanation: "aa" is replaced by "a2". "bb" is replaced by "b2". "ccc" is replaced by "c3".
Example 2:
Input: ["a"] Output: Return 1, and the first 1 characters of the input array should be: ["a"] Explanation: Nothing is replaced.
Example 3:
Input: ["a","b","b","b","b","b","b","b","b","b","b","b","b"] Output: Return 4, and the first 4 characters of the input array should be: ["a","b","1","2"]. Explanation: Since the character "a" does not repeat, it is not compressed. "bbbbbbbbbbbb" is replaced by "b12". Notice each digit has it's own entry in the array.
Note:
- All characters have an ASCII value in
[35, 126]
.1 <= len(chars) <= 1000
.
题中说的不明白,其实是哈夫曼编码,就是对于连续字符用字符+数字的方式代替,后面提示的asc2码其实是迷惑大家的,原理很简单,从头到尾遍历字符数组,每次与前一个比较,不一样就输出并且重置count,一样就count++,结果:
Success
Runtime: 4 ms, faster than 99.57% of C++ online submissions for String Compression.
Memory Usage: 9.1 MB, less than 88.84% of C++ online submissions for String Compression.
代码:
class Solution {
public:
int compress(vector<char>& chars) {
int count=1;
short index=0;
for(int i=0;i<chars.size();i++){
if(i==chars.size()-1||chars[i]!=chars[i+1]){
chars[index++]=chars[i];
if(count==1){;}
else if(count<10){chars[index++]='0'+count;}
else if(count<100){chars[index++]='0'+count/10;chars[index++]='0'+count%10;}
else {chars[index++]='0'+count/100;chars[index++]='0'+(count/10)%10;chars[index++]='0'+count/10;}
count=1;
}
else {count++;}
}
return index;
}
};