题解 | #压缩牛群编号#
压缩牛群编号
https://www.nowcoder.com/practice/db9dd240e5f54b6d8eeadfbd9b7f865f
考察的知识点:字符串;
解答方法分析:
- 创建一个整数变量write和一个整数变量left,初始值都为0。write用于记录当前写入位置,left用于记录当前连续字符序列的起始位置。
- 遍历输入的字符数组chars,使用一个整数变量read作为遍历指针。
- 对于每个字符chars[read],判断它是否和下一个字符chars[read + 1]相同,或者已经到达数组末尾(即read == n - 1)。
- 如果当前字符chars[read]不等于下一个字符chars[read + 1],则说明这是一个连续字符序列的结束位置。
- 将当前字符chars[read]写入到chars[write++]中,表示压缩后的字符。
- 计算连续字符序列的长度num,即read - left + 1。
- 如果num大于1,说明连续字符序列有重复的字符。
- 将num转换为字符串str,使用to_string函数进行转换。
- 遍历字符串str的每个字符ch,将其依次写入到chars[write++]中。
- 更新left的值为read + 1,表示下一个连续字符序列的起始位置。
- 遍历结束后,将chars数组的长度调整为write,即截断多余的部分。
- 返回压缩后的字符数组chars。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param chars char字符型vector
* @return char字符型vector
*/
vector<char> compress(vector<char>& chars) {
int n = chars.size();
int write = 0, left = 0;
for (int read = 0; read < n; read++) {
if (read == n - 1 || chars[read] != chars[read + 1]) {
chars[write++] = chars[read];
int num = read - left + 1;
if (num > 1) {
string str = to_string(num);
for (char& ch : str) {
chars[write++] = ch;
}
}
left = read + 1;
}
}
chars.resize(write);
return chars;
}
};
