代码题--C++--压缩字符串

代码题--C++--压缩字符串


题目描述:

给定一组字符,使用原地算法将其压缩。

压缩后的长度必须始终小于或等于原数组长度。

数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。

在完成原地修改输入数组后,返回数组的新长度。

示例 1:

输入:
["a","a","b","b","c","c","c"]

输出:
返回 6 ,输入数组的前 6 个字符应该是:["a","2","b","2","c","3"]

说明:
"aa" 被 "a2" 替代。"bb" 被 "b2" 替代。"ccc" 被 "c3" 替代。
示例 2:

输入:
["a"]

输出:
返回 1 ,输入数组的前 1 个字符应该是:["a"]

解释:
没有任何字符串被替代。
示例 3:

输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]

输出:
返回 4 ,输入数组的前4个字符应该是:["a","b","1","2"]。

解释:
由于字符 "a" 不重复,所以不会被压缩。"bbbbbbbbbbbb" 被 “b12” 替代。
注意每个数字在数组中都有它自己的位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-compression

解决思路:

两个指针,i,j,i和j都从0 开始走,i是遍历字符数组的,j记录第一次出现字符的位置,所以将 j= i。

count记录重新填充数组的位置下标。

比如代码中的例子,i,j先都指向0位置,进入循环判断时,指向的值相等,则i++直到i= 4的时候,不相等了,进不去循环,

然后先将j位置保存的数据填进chars[count]位置,然后count++,再考虑填个数,

如果是1个就不用填数字,也就是(i-j == 1),假如{'a','b'},退出循环后,i = 1, j =0, 这时退出本次循环,不执行下面的语句,继续下个字符的比较,此时 在退出循环的时候设置的 j = i。

(i-j > 1)时,统一当字符处理,为了解决两位数以上的数字一位一位的填。

最后return count; 返回新数组的大小。

代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

//字符串缩减
class Solution {
public:
	int compress(vector<char>& chars) {
		int n = chars.size();
		int cur = 0;
		for (int i = 0, j = 0; i < n; j = i) {
			while (i < n && chars[i] == chars[j]) {
				i++;
			}
			//将当前这个字符先依次填入chars中,并且计数大小
			chars[cur++] = chars[j];
			//如果字符数只有1,那么跳出此次循环,然后继续下一个字符
			if (i - j == 1) {
				continue;
			}
			//为处理两位数以上的数字,所以将数字转成string,然后按照字符填进去
			string s = to_string(i - j);
			for (int t = 0; t < s.size(); t++) {
				chars[cur++] = s[t];
			}
		}
		return cur;
	}
};

int main()
{
	Solution sa;
	vector<char> vector1 = {'a','a','a','a','b','b'};

	cout << sa.compress(vector1) << endl;
	return 0;
}

结果图:{'a','4','b','2'},大小为4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值