【转载请注明】https://www.cnblogs.com/igoslly/p/9017638.html
来看一下题目:
The string P A H N
A P L S I I G
Y I R
And then read line by line: Write the code that will take a string and make this conversion given a number of rows: string convert(string s, int numRows);
Example 1: Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2: Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
|
题目意思: 给出字符串和行数 设计出一种“竖-斜”式的显示形式 结果给出按横行读取的数值 |
下面的图可能能更好的解释图示法:
总的来说:
1、显示法
利用代码实现zigzag这样的变形,再按读取方向输出
class Solution { public: string convert(string s, int numRows) { if(numRows==1){return s;} int length = s.size(),count=0; char zigzag[numRows][length]; // 设定行、列矩阵 fill(zigzag[0],zigzag[0]+numRows*length,'#'); // 初始化二维数组,首位置为zigzag[0] enum{down,linear}; // 设定方向 int dir=down,x=0,y=0; while(count<s.size()){ switch(dir){ // 判断方向 case down: zigzag[x++][y]=s[count++]; // 当竖行越界后,已经到达末行+1,需要进行位置调整x-2,y+1 if(x>=numRows){dir=linear;x-=2;y++;} break; case linear: zigzag[x--][y++]=s[count++]; // 当斜行越界后,到达首行-1,需要进行位置调整x+2,y-1 if(x<0){dir=down;x+=2;y--;} break; } } string result; for(int i=0;i<numRows;i++){ for(int j=0;j<length;j++){ if(zigzag[i][j]!='#'){ result+=zigzag[i][j]; } } } return result; } };