下面反向遍历,还是正向好。
void left(vector& v, bool p(int)) { int max_index = v.size() - 1; int del = -1; int rel = -1; while (del < max_index) { while (p(v[del]) && del < max_index) del++; if (del >= max_index) break; if (rel < del) rel = del; while (!p(v[rel]) && rel <= max_index) rel++; if (rel > max_index) break; swap(v[del], v[rel]); del++; } } int compress(vector & chars) { int size = chars.size(); int point = size - 1; int count = 1; for (int i = point; i >= 0; i--) { if (chars[i] == chars[i - 1] && i > 0) count++; else if (count > 1) { for (int j = count - 1; j > 0; j--) chars[i + j] = 2; string temp = to_string(count); for (int j = 0; j < temp.size(); j++) chars[i + j + 1] = temp[j]; count = 1; } } left(chars, [](int v) { return v != 2;}); return count_if(chars.begin(), chars.end(), [](int v) { return v != 2;}); }
其他答案:
int compress(vector& chars) { int lo=0; int cnt=0; for(int i=0; i 1){ string nums=to_string(cnt); for(int i=0; i