leetcode-个人题解6

来源:互联网 发布:java如何获取微信code 编辑:程序博客网 时间:2024/05/06 18:25

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)

原创粉丝点击