LeetCode之443. 压缩字符串

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();
	}
};

可优化的空间还很大,但是思路清晰了坑也踩过了,先放着吧。

发布了71 篇原创文章 · 获赞 27 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/github_34777264/article/details/84648481