[Leetcode] 6. ZigZag Convertion 之字形转换字符串

Related Topics:[String]
Similar Questions

题目: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时的走法是:

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(n+n-2) (第二列第一行和最后一行少字)。

利用这个规律,可以按行填字。每一行中分为直线列元素和斜线列元素来处理。每一行中的直线列在原字符串中的索引均相差2n-2。而斜线上的元素的索引可由前一个直线列上的元素(即左方元素)的索引求得,即j+(2n-2)-2i(j和i分别为前一元素的列和行)。

在第一行和最后一行中,只存在直线列元素。其他行中两种元素交叉分布。

按照上面的规律就可以写出代码了。

java解法:

class Solution {
    public String convert(String s, int numRows) {
        if(numRows<=1) return s;
        int size=2*numRows-2;
        String res="";
        for(int i=0;i

你可能感兴趣的:([Leetcode] 6. ZigZag Convertion 之字形转换字符串)