leetcode6. ZigZag Conversion

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                       0
1                       1    = 0+1
2                       2    =1+1
3                       3    =2+1
4                       2    =3-1 此处波形折返
5                       1    =2-1
6                       0    =1-1
7                       1    =0+1此处波形折返
。。。。。。
n                       j     
n+1                  h    =j+(step)   step根据折返情况而定,每次折返时,都会取step = 0-step;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值