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

题目考察的知识点

字符串处理,模拟算法,数组的遍历与操作。

题目解答方法的文字分析

这道题目要求我们根据给定的加密字符串 s 和行数 numRows 进行解码,字符串是按照"Z"字形排列方式加密的,我们需要还原成正常的横向读取的形式。

解题思路:

  1. 首先,我们检查特殊情况,如果 numRows 为 1,那么直接返回原字符串 s
  2. 创建一个长度为 numRows 的字符串数组 rows,用于存储每一行的字符。
  3. 定义一个整数变量 curRow 表示当前行的索引,初始化为 0。
  4. 定义一个布尔变量 goingDown 表示当前的遍历方向,初始化为 false。这里使用 goingDown 来控制 "Z" 字形的上下变换。
  5. 遍历加密字符串 s,依次将字符放入对应的行,同时根据方向 goingDown 控制行索引 curRow 的增减。
  6. 最后按行拼接各个字符串,得到解码后的结果。

举例说明

输入:"TWIPARSEHC_NK",3

返回值:"TAHKWPRECNIS_"

说明:

字符串的Z字型排列为:

T 空 A 空 H 空 K

W P R E C N 空

I 空 S 空 _ 空 空

本题解析所用的编程语言

C++

完整且正确的编程代码

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

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 解码函数,根据给定的加密字符串 s 和行数 numRows 进行解码
     * 字符串是按照"Z"字形排列方式加密的,我们需要还原成正常的横向读取的形式
     *
     * @param s string类型 加密字符串
     * @param numRows int类型 行数
     * @return string类型 解码后的结果
     */
    string decodeFlag(string s, int numRows) {
        if (numRows == 1)
            return s; // 如果只有一行,直接返回原字符串

        vector<string> rows(min(numRows, int(s.length()))); // 创建 numRows 个字符串用于存储每一行的字符
        int curRow = 0; // 当前行的索引,初始化为 0
        bool goingDown = false; // 遍历方向标志,false 表示向上,true 表示向下

        for (int i = 0; i < s.length(); i++) {
            // 将当前字符添加到对应的行
            if (rows[curRow].empty()) {
                rows[curRow] = s[i];
            } else {
                rows[curRow] += s[i];
            }

            // 到达首行或末行时,方向反转
            if (curRow == 0 || curRow == numRows - 1) {
                goingDown = !goingDown;
            }

            // 根据方向移动到下一行或上一行
            curRow += goingDown ? 1 : -1;
        }

        string res; // 用于存储解码后的结果
        for (string& row : rows) {
            res += row; // 按行拼接字符串
        }

        return res; // 返回解码结果
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!