443 题是简单题,用C#,java,python等高级语言来说很简单,但是我非要用不擅长的C++来解,而且还要用O(1)空间复杂度,其实即使这样也不难,可是我C++比较菜,这道题试了好几个小时,主要问题在指针和迭代器的区别以及C++中各种数据类型的区别和联系上,幸运的是最后解出来了,而且显示战胜了100%的提交。不说了下面是我的代码
思路:先让tmp等于整个字符,然后循环遍历vector,遇到和tmp相同的就直接删除,如果是最后一个连续相同的就将个数转换成char插入vector中, 再将个数count置1,重复此过程。 难点是最后一个字符的判断,因为设计末尾指针,所以保出现了很多次错误,但是最后也尝试出来了。
class Solution {
public:
int compress(vector<char>& chars) {
if (chars.size() <= 1) return chars.size();
vector<char>::iterator it = chars.begin();
++it;
int count = 1;
char tmp = chars[0]; //先令tmp等于第一个字符
char ccc = *(chars.end() - 1);
while (it < chars.end())
{
if (*it == tmp) // 判断是不是和tmp相等
{
++count;
if (it == chars.end() - 1) { //
if (count != 1) {
string s = to_string(count);
for (char c : s) { //将count中的数字转化成char插入vector
it = chars.insert(it, c);
++it; // 此处一定要
}
it = chars.erase(it); // 很重要,一定要查删除整个元素,因为这是原来vector中最后一个元素
}
//++it; // 此处一定不能++it, 否则指针不知道指向哪里去了
}
else {
it = chars.erase(it);
}
}
else
{
if (count != 1)
{
string s = to_string(count);
for (char c : s)
{
it = chars.insert(it, c);
++it;
}
}
tmp = *it;
count = 1;
++it;
}
}
return chars.size();
}
};
可优化的空间还很大,但是思路清晰了坑也踩过了,先放着吧。