题目信息:
将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING"
行数为 3
时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
分析:
1、获取目标:题目最终输出是需要我们按照s抽象出来的矩阵进行行读取。
根据题目信息分析得到,s串的输入是是从上到下,从左到右的Z字形字符串,为了方做题解答,我们需要对s串抽象出的矩阵,进行表示;
可以采用二维数组的方式来表示s抽象出来的矩阵;
2、如何将信息存储到二维数组中
根据题干信息找规律,发现,通过传入API的第二个数据可以确定抽象矩阵行数,其次这个矩阵元素呈Z字型传递,也就是传递时,设计到的操作是当前位置-1,则可以设置一个记录变量flag1表示传递,初值为-1,随后在同列元素间的存储传递采用+1操作,同样可以设置一个记录变量flag2,由于flag1和flag2的变换时机并不冲突,所以可以使用一个变量表示,flag;
3、代码实现:
class Solution {
public:
string convert(string s, int numRows) {
//特殊化处理
if(numRows==1){
return s;
}
//设置返回值
string con;
//抽象出存储矩阵空间
vector<string>rows(numRows);
//将s中数据存储到矩阵中
int i=0;//坐标记录量
int flag=-1;
for(auto w:s){
rows[i].push_back(w);
if(i==0||i==numRows-1)//设置换列操作
flag=-flag;
i+=flag;
}
for(auto cs:rows){
con+=cs;
}
return con;
}
};
总结:
小编认为本题和655输出二叉树一样,都需要抽象二维存储形态,只不过本题没有明确指出,655明确指出了存储形态,对于这类型的题,将抽象具象化后,思路便会非常清晰,而难点主要在于,如何将抽象具象化,小编认为,可以目的性的训练自己的空间想象力和去阅读学习一些关于相关的资料,最后,祝阅读本文的友友,算法进步!!