题目
The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N A P L S I I G Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
样例
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
解析
给定一字符串和行数,将其Z字形排列,然后输出按行读出的结果。
最先想到的就是用二维数组存储,然后按行依次读取输出 ,数组的行数就是numRows,列数为,即,其中len是字符串的长度,原因如下:
观察样例中的Z字图形,发现它具有周期性,每numRows-1列是一个周期,一个周期可以容纳2(numRows-1)个字符,所以要想容纳len个字符,就需要列。
class Solution {
public:
string convert(string s, int numRows) {
int len=s.length();
string ans="";
if(len==0||numRows==1) return s;
memset(cnt,100,sizof(cnt)); //初始化数组
int i=0,j=0; //i标记行,j标记列
cnt[0][0]=int(s[0]-'A'); //用数字存放首字母
len--;
while(len)
{
for(i=1;(i<numRows)&&len;i++) //竖直的边
{
cnt[i][j]=int(s[s.length()-len]-'A');
len--;
}
i--; //返回到最后一行
while(i&&len) //斜边
{
j++;
i--;
cnt[i][j]=int(s[s.length()-len]-'A');
len--;
}
}
for(int m=0;m<numRows;m++)
{
for(int n=0;n<=j;n++)
{
if(cnt[m][n]!=100) ans=ans+char(cnt[m][n]+'A');
}
}
return ans;
}
};
这种方法耗时较长,之后再写一种找规律的 解法。