LeetCode #6 Z字形变换
题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
解法1:暴力二维数组模拟
过程过于繁琐且蠢,不再列举了。
解法2:思维二维数组模拟
是LeetCode官方解法,学习一波,思维真的巧妙。
实际上还是模拟,不过不是真正的模拟了,而是稍微变换了一下,
把
L C I R
E T O E S I I G
E D H N
变成了
L C I R
E T O E S I I G
E D H N
因为略去了对空白部分的处理,且,在“拐角”处,处理精妙,导致代码非常精简明了。
对于最终的“从上往下,从左往右”产生新的字符串,实际上还是一样的效果。
这里用Vector实现。
class Solution {
public:
string convert(string s, int numRows) {
//如果行数为1,或者字符串长度小于行数,显然直接返回s
if(numRows==1||s.size()<numRows)
return s;
//定义numRows个string类型的vector
vector<string> rows(numRows);
bool flag=false;//true向上存储,false向下存储
int nowR=0;
for(char c:s){
rows[nowR] = rows[nowR] + c;
if(nowR==0||nowR==numRows-1){
//当且仅当nowR指针到达第一行或最后一行时,flag变向
flag=!flag;
}
nowR = nowR + (flag?1:-1);
}
string ans;
//从vector中取出字符串,拼接到一起
for(string row:rows){
ans+=row;
}
return ans;
}
};