leetcode-个人题解6

LEETCODE专题


6. ZigZag Conversion

照例先上个题目要求:
这里写图片描述


这里首先讲一下什么叫“ZigZag Pattern”。
这里写图片描述

简单来说就是两条平行线之间的一条有折角的曲线,每个折角度数相同并且角的顶点均在两条平行线上。而适用到这道题上,其实也就是“N”上下颠倒的形状。


实现的主要问题只有一个:如何找到每一行字符下标的变换规律
这里要多举点例子仔细观察一下。譬如题目给的例子,改一下行数就会发现其实字符下标是有周期的,而这个周期就是2 *(numRows - 1)。

    输入: "PAYPALISHIRING" 3
    P A H N
    APLSIIG
    Y I R
    输出: "PAHNAPLSIIGYIR"

    输入:"PAYPALISHIRING" 4
    P  I  N
    A LS IG
    YA HR
    P  I
    输出: "PINALSIGYAHRPI"

    输入: "PAYPALISHIRING" 5
    P   H
    A  SI
    Y I R
    PL  IG
    A   N
    输出: "PHASIYIRPLIGAN"

有好几行在一个周期内除了周期对应的字符外,还有其它的字符。这个字符在某些人的解法里被称为“partner”,找到了该字符与其“partner”的下标变换规律之后,其实也就找到了改行内所有字符下标的变换规律,自然也就能解决这一行的所有字符输出了。但是,第一行和最后一行的字符是没有“partner”的,这点要尤其注意!

最后就是一个细节问题,警惕输入只有一个字符或者输入的行数只有1


下面直接上code:

class Solution {
public:
    string convert(string s, int numRows) {
        int i, index, change;
        string result;
        for (i = 1; i < numRows; i++) {
            index = i - 1;
            change = 2 * (numRows - i);
            while (index < s.length()) {
                result += s[index];
                index += change;
                change = i == 1 ? 2 * (numRows - i) :
                    2 * (numRows - 1) - change;
            }
        }

        // Now i == numRows
        index = i - 1;
        change = numRows == 1 ? 1 : 2 * (numRows - 1);
        while (index < s.length()) {
            result += s[index];
            index += change;
        }
        return result;
    }
};

时间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/m0_37576233/article/details/78163110