LeetCode(60)-ZigZag Conversion

时间:2023-03-09 07:57:35
LeetCode(60)-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   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".

思路:

  • 题意:首先这是一个z字形排列的数组,按照行输出
n=2时,字符串坐标变成zigzag的走法就是:

 0 2 4 6

 1 3 5 7

 n=3时的走法是:

 0     4     8

 1  3 5  7 9

 2     6    10 

 n=4时的走法是:

 0      6        12

 1   5 7    11 13

 2 4   8 10    14

 3      9         15 

 利用这个规律,可以按行填字,第一行和最后一行,就是按照2n-2的顺序排列。

 其他行除了上面那个填字规则,就是还要处理斜着那条线的字,可以发现那条线的字的位置永远是当前列j+(2n-2)-2i(i是行的index),同时和 2n-2间隔排列组成中间的行

代码:

public class Solution {
    public String convert(String s, int numRows) {
        if(s == null && s.length() == 0 && numRows <= 0){
            return "";
        }
        if(numRows == 1){
            return s;
        }
        StringBuffer sb = new StringBuffer();
        int size = 2*numRows - 2;
        for(int i = 0;i < numRows;i++){
            for(int j = i;j < s.length();j = j+size){
                sb.append(s.charAt(j));
            if(i != 0 && i != numRows-1){
                int tmp = j + size -2*i;
                if(tmp < s.length()){
                sb.append(s.charAt(tmp));
                }
                }
            }
        }
        return sb.toString();
    }
}