大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
字符串处理,模拟算法,数组的遍历与操作。
题目解答方法的文字分析
这道题目要求我们根据给定的加密字符串 s
和行数 numRows
进行解码,字符串是按照"Z"字形排列方式加密的,我们需要还原成正常的横向读取的形式。
解题思路:
- 首先,我们检查特殊情况,如果
numRows
为 1,那么直接返回原字符串s
。 - 创建一个长度为
numRows
的字符串数组rows
,用于存储每一行的字符。 - 定义一个整数变量
curRow
表示当前行的索引,初始化为 0。 - 定义一个布尔变量
goingDown
表示当前的遍历方向,初始化为false
。这里使用goingDown
来控制 "Z" 字形的上下变换。 - 遍历加密字符串
s
,依次将字符放入对应的行,同时根据方向goingDown
控制行索引curRow
的增减。 - 最后按行拼接各个字符串,得到解码后的结果。
举例说明
输入:"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; // 返回解码结果 } };