• ㊗️
• 大家
• offer
• 多多！

Problem

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


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


Example 3:

Input: s = "A", numRows = 1
Output: "A"


Constraints:

• 1 <= s.length <= 1000
• s consists of English letters (lower-case and upper-case), ‘,’ and ‘.’.
• 1 <= numRows <= 1000

Code

class Solution {
public String convert(String s, int numRows) {
StringBuilder[] sbs = new StringBuilder[numRows];

for(int i = 0; i < numRows; i++){
sbs[i] = new StringBuilder();
}

int i = 0;
while(i < s.length()){
// 从上到下
int rowIndex = 0;
while(i < s.length() && rowIndex <= numRows - 1){
sbs[rowIndex].append(s.charAt(i));
i++;
rowIndex++;
}

// 从下到上
// -2才是倒数第二行
rowIndex -= 2;
while(i < s.length() && rowIndex >= 1){
sbs[rowIndex].append(s.charAt(i));
i++;
rowIndex--;
}
}

for(int j = 1; j < numRows; j++){
sbs[0].append(sbs[j].toString());
}

return sbs[0].toString();
}
}