题解 | #压缩牛群编号#
压缩牛群编号
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; } };