首页 > 代码库 > [LeetCode] 6. ZigZag Conversion ☆☆☆

[LeetCode] 6. 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".

 

解法: 

  n = 2 时,字符串坐标变成zigzag的走法就是:

0 2 4 6

1 3 5 7

  n = 3 时,字符串坐标变成zigzag的走法就是:

0     4     8

1  3  5  7  9

2     6     10

  n = 5 时,字符串坐标变成zigzag的走法就是:

0           8             16

1        7  9         15  17

2     6     10     14     18

3  5        11  13        19

4           12            20

  可以发现,画红色的(一个循环)长度永远是 2n-2。

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

  其他行除了上面那个填字规则,就是还要处理斜着那条线的字,可以发现那条线的字的位置永远是 j+(2n-2)-2i(i 是当前行的索引,j 是当前行的当前循环的起始值,如 i = 1 时,j 依次等于 1, 9, 17....)。

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

 

[LeetCode] 6. ZigZag Conversion ☆☆☆