大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的是对字符数组的处理和压缩操作,同时要求使用常量额外空间完成。

题目解答方法的文字分析

我们需要对输入的字符数组进行遍历,统计连续相同字符的数量,并将结果进行压缩。要注意,压缩后的结果需要重新存储到输入字符数组中,并返回新的数组长度。

思路步骤:

  1. 定义两个指针,一个用于遍历原始字符数组,另一个用于记录新的压缩字符数组的位置。
  2. 初始化计数器count为1,用于记录当前连续相同字符的数量。
  3. 遍历原始字符数组:如果当前字符与前一个字符相同,增加计数器count。如果当前字符与前一个字符不同,将前一个字符拷贝到新的字符数组中,并根据count的值来确定是否压缩数量。更新计数器count为1。
  4. 处理最后一个字符,重复步骤3中的操作。
  5. 返回新的字符数组长度。

本题解析所用的编程语言

本题解析使用C++语言。

完整且正确的编程代码

#include <vector>

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param chars char字符型vector 
     * @return char字符型vector
     */
    vector<char> compress(vector<char>& chars) {
        int n = chars.size(); // 原始字符数组长度
        int writeIndex = 0; // 新的字符数组写入位置
        int count = 1; // 记录连续相同字符的数量

        for (int i = 1; i < n; i++) {
            if (chars[i] == chars[i - 1]) {
                count++;
            } else {
                chars[writeIndex++] = chars[i - 1]; // 将前一个字符拷贝到新的字符数组中
                if (count > 1) {
                    // 如果当前字符连续出现次数大于1,则将其压缩成字符+数量的形式
                    string countStr = to_string(count);
                    for (char ch : countStr) {
                        chars[writeIndex++] = ch;
                    }
                }
                count = 1; // 重置计数器
            }
        }

        // 处理最后一个字符
        chars[writeIndex++] = chars[n - 1];
        if (count > 1) {
            string countStr = to_string(count);
            for (char ch : countStr) {
                chars[writeIndex++] = ch;
            }
        }

        // 返回新的字符数组长度
        return vector<char>(chars.begin(), chars.begin() + writeIndex);
    }
};