大家好,我是开车的阿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; // 返回解码结果
}
};

京公网安备 11010502036488号