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"
把字符按|/|/|这样排列,再按行输出。直接构造一个二维数组,把这个形状打印进去,最后按行输出即可。x,y存储下一次的写入位置
class Solution {
public:
string convert(string s, int numRows) {
int len = s.length();
if(numRows==1||len<=numRows)return s;
int lie = len / numRows;
lie = getlie(len,numRows);
char *ans;
ans = (char *)malloc(len + 1);
ans[len] = '\0';
fill(ans, ans + len+1, '\0');
char sz[1000][1000];
fill(sz[0], sz[0] + 1000 * 1000, '\0');
int x = 0, y = 0, ptr = 0;
int i;
for (i = 0; i < len; i++) {
sz[x][y] = s[ptr];
ptr++;
if (x == 0 || (sz[x - 1][y] != '\0'&&x < numRows - 1))x++;
else {
x--; y++;
}
}
ptr = 0;
for (i = 0; i < numRows; i++) {
int j;
for (j = 0; j < lie; j++) {
if (sz[i][j] != '\0') {
ans[ptr] = sz[i][j];
ptr++;
}
}
}
string out = ans;
return out;
}
int getlie(int len, int row) {
int ans = 0;
ans = (len / (2 * row - 2)) * row;
ans += (len % (2 * row - 2)) > row ? 1 + (len % (2 * row - 2)) : 1;
return ans;
}
};