代码题--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