JIAKAOBO

LeetCode

venmo
wechat

感谢赞助!

  • ㊗️
  • 大家
  • 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();
    }
}