leetcode6. ZigZag Conversion

来源:互联网 发布:易了千明编程论坛 编辑:程序博客网 时间:2024/05/29 13:28

leetcode6. ZigZag Conversion
理解题意:
zigzag即为z字形,所以n>3的情况下,原始字符串的下标排列如下(n=4):

0                          6    1                  5       7        2         4                8            3                           9.........

思路1:
1.对于n行,我们分别找出第n行对应的每一个元素在原始字符串中的下标的规律,然后依次按行遍历按列打印即可。
规律为:第一行和最后一行,都是间隔2(n-1)个元素;其他行如行k,两个间隔为2(n-1)的元素之间还有一个元素,该元素与该行前一个元素的距离为2(n-1 - k);源码如下:

class Solution {public:    string convert(string s, int numRows) {        int pos = 0;        int i=0;        int halfSizeInOneCycle = numRows - 1;        int sizeInOneCycle = 2*halfSizeInOneCycle;        string result;        int len = s.size() - 1;        while(i<numRows){            pos = i;            while(pos <= len){                result += s[pos];                if(i != halfSizeInOneCycle && i != 0 && pos + sizeInOneCycle - 2 * i <= len){                    result += s[pos + sizeInOneCycle - 2 * i];                }                if(sizeInOneCycle > 0)                    pos += sizeInOneCycle;                else                    pos += 1;            }            i++;        }        return result;    }};

思路2:
分别对每一行构造一个字符串,从上述排列情况可以看出规律为:若遍历字符串s,则每个字符落入的排列位置在上下波动,每到0和第n行则折回,且每到一个字符,对应的行号会改变,这样,我们可以在遍历整个字符串s过程中,把循环过程中的当前字符追加到对应行的尾部,关键是找到正确的行号。字符和行号对应关系如下:

字符下标       字符落入的行号0                       01                       1    = 0+12                       2    =1+13                       3    =2+14                       2    =3-1 此处波形折返5                       1    =2-16                       0    =1-17                       1    =0+1此处波形折返。。。。。。n                       j     n+1                  h    =j+(step)   step根据折返情况而定,每次折返时,都会取step = 0-step;

那么,遍历整个字符串,就可以得到每一行对应的子字符串了。

原创粉丝点击