ZigZag Conversion
(原题链接:
点击打开链接)
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 RAnd 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 text, int nRows);
convert("PAYPALISHIRING", 3)
should return
"PAHNAPLSIIGYIR"
.
Solution:
方法一简单粗暴,按所要求方式生成对应的numRows*s.length()的表,然后再按顺序输出。
class Solution {
public:
string convert(string s, int numRows) {
if(s.length() == 0 || numRows == 1) return s;
char table[numRows][s.length()];
for(int a = 0; a < numRows; a++)
{
for(int b = 0; b < s.length(); b++)
{
table[a][b] = 0;
}
}
int state = 0; //两种状态,竖直向下0,斜着向上1
int row = 0;
int col = 0;
for(int a = 0; a < s.length(); a++)
{
if(state == 0)
{
table[row][col] = s[a];
row++;
if(row == numRows)
{
row--;
if(row > 0) row--;
col++;
state = 1;
}
}
else
{
table[row][col] = s[a];
row--;
col++;
if(row < 0)
{
row = 1;
col--;
state = 0;
}
}
}
string answer = "";
for(int a = 0; a < numRows; a++)
{
for(int b = 0; b < s.length(); b++)
{
if(table[a][b] != 0) answer += table[a][b];
}
}
return answer;
}
};
方法二先按照生成方式找到对应的数学关系,然后按数学关系取出s中对应位置的值,组成answer。
运行1158个例子时间由92ms变为22ms
class Solution {
public:
string convert(string s, int numRows) {
if(s.length() == 0 || numRows == 1) return s;
string answer = "";
int totaljiange = 2 * numRows - 2;
int topnums = (s.length() - 1) / totaljiange + 1;
for(int a = 0; a < numRows; a++)
{
int jiange = 2 * numRows - 2 * (a + 1);
for(int b = 0; b < topnums; b++)
{
if(a == 0 || a == numRows - 1)
{
if(a + totaljiange * b < s.length()) answer += s[a + totaljiange * b];
}
else
{
if(a + totaljiange * b < s.length()) answer += s[a + totaljiange * b];
if(a + totaljiange * b + jiange < s.length()) answer += s[a + totaljiange * b + jiange];
}
}
}
return answer;
}
};