ZigZag Conversion leetcode

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".

 

 

Subscribe to see which companies asked this question

 

 

P   A   H   N
A P L S I I G
Y   I   R

我们可以将其划分为4个区域

P   | A   | H   | N
A P | L S | I I | G
Y   | I   | R   |

每个区域的数字个数计算公式为:

cycle = (2 * nRows - 2)

该例中为 2*nRows - 2 = 4.

每个区域中, 除了第一行和最后一行,每行都有2个元素

假设行号是i,则每行的第一个元素下标j为

j = i + cycle*k, k = 0, 1, 2, ...

第二个元素下标为:

secondJ = (j - i) + cycle - i

(j-i) 是当前区域的第一个, (j-i) + cycle 是下个区域的第一个

代码如下:

string convert(string s, int nRows) {
    if (nRows <= 1) return s;
    string result = "";
    //the size of a cycle(period)
    int cycle = 2 * nRows - 2;
    for (int i = 0; i < nRows; ++i)
    {
        for (int j = i; j < s.length(); j = j + cycle) {
            result = result + s[j];
            int secondJ = (j - i) + cycle - i;
            if (i != 0 && i != nRows - 1 && secondJ < s.length())
                result = result + s[secondJ];
        }
    }
    return result;
}

 

posted @ 2016-01-05 22:07  sdlwlxf  阅读(137)  评论(0编辑  收藏  举报