美文网首页
[Leetcode] 6. ZigZag Convertion

[Leetcode] 6. ZigZag Convertion

作者: lijia069 | 来源:发表于2017-12-19 10:35 被阅读0次

    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<numRows;i++) {
                for(int j=i;j<s.length();j+=size) {
                    res+=s.charAt(j);
                    int tmp=j+size-2*i;
                    if(i!=0&&i!=numRows-1&&tmp<s.length()) res+=s.charAt(tmp);
                }
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:[Leetcode] 6. ZigZag Convertion

          本文链接:https://www.haomeiwen.com/subject/dpkbwxtx.html