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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章