原题:
解题:
看到题目就想到用map计数,然后将计数的位数计算处理,这里的解法并不满足题目的额外O(1)的要求,并且只是返回了结果array的长度,并未修改原始vector的元素。
代码如下:
class Solution { public: int bitsOfNumber(int n) { int cnt = 0; if (n <= 1) return 0; //若为1,则不增加 while(n) //统计位数,如12就是2位 { cnt++; n /=10; } return cnt; } int compress(vector<char>& chars) { int size = chars.size(); int i = 0; int sum = 0; map <char, int> mapchar; map <char, int>::iterator it; for(;i < size;i++) { mapchar[chars[i]]++; //统计各个字符个数 } it = mapchar.begin(); while(it != mapchar.end()) { if(it->second != 0) //如果有这个字符 { sum += bitsOfNumber(it->second) + 1; //字符本身也占据一个元素位置,所以要加1 } it++; } return sum; } };
AC代码如下:
class Solution { public: int compress(vector<char>& chars) { int len = chars.size() ; if (len < 2) return len ; int res = 0 ; char c = chars[0] ; int num = 1 ; chars.push_back(' ') ; for(int i = 1 ; i < len+1 ; i++){ if (chars[i] == chars[i-1]) num++ ; if (chars[i] != chars[i-1] ){ chars[res++] = c ; if (num > 1){ string s = to_string(num) ; for(int j = 0 ; j < s.size() ; j++){ chars[res++] = s[j] ; } } num = 1 ; c = chars[i] ; } } return res ; } };