6. Z 字形变换
Posted Ston.V
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6. Z 字形变换相关的知识,希望对你有一定的参考价值。
1.Description
将一个给定字符串 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);
2.Example
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
3. My Code(二维数组)
class Solution
public:
string convert(string s, int numRows)
int n = s.length();
int numCols = n;
vector<vector<char>> v(numRows,vector<char>(numCols,'0'));
int col=0;
//对于只有1行的,循环出不来,直接返回
if(numRows ==1)
return s;
//col表示列,j表示行
for(int i=0;i<n;i=i+(2*numRows-2))
int j=0;
for(j=0;j<numRows;j++)
if(i+j >= n)
break;
v[j][col] = s[i+j];
j--;
for(int k=0;k<numRows-2;k++)
j--;
col++;
if(i+numRows+k >= n)
break;
v[j][col] = s[i+numRows+k];
col ++;
string res="";
for(int i=0;i<numRows;i++)
for(int j=0;j<numCols;j++)
if(v[i][j]!='0')
res+=v[i][j];
return res;
;
4.Code
左到右按箭头方向迭代 s
,将每个字符添加到合适的行。之后从上到下遍历行。
构建多个行,然后遍历字符串s,依次为不同行填上对应的字符。
class Solution
public:
string convert(string s, int numRows)
int n = s.length();
if(numRows < 2)
return s;
vector<string> v(numRows);
bool down = false;
int currRow = 0;
for(char c:s)
v[currRow] += c;
if(currRow ==0 || currRow == numRows-1)
down = !down;
currRow += down?1:-1;
string res;
for(string str:v)
res += str;
return res;
;
5.注意
1.对于只有一行的,直接返回。
2.使用一维数组,用布尔变量控制行数的走向,确实比用二维数组厉害的多。
以上是关于6. Z 字形变换的主要内容,如果未能解决你的问题,请参考以下文章