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 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; } };