lichao_normal

导航

zigzag convert

char* convert(char* s, int numRows) {
    if(numRows<=1||strlen(s)<numRows)return s;
    char *res=(char*)malloc(sizeof(char)*(strlen(s)+1));
    int flag=0;
    int j=0;
    int count=0;
    for(int i=0;i<numRows;i++){
        j=i;
        flag=0;
        while(j<strlen(s)){
            res[count++]=s[j];
            if(i==0||i==numRows-1){
                j+=2*(numRows-1);
            }
            else{
                if(flag==0){
                    j+=2*(numRows-i-1);
                    flag=1;
                }
                else{
                    j+=2*i;
                    flag=0;
                }
            }
        }
    }    
    res[count]='\0';
    return res;
}
代码

zigzag问题很简单。我们的处理办法是这样的:

对于1,2,3,4,5,6.。。。。。。

当numRows=1时:

输出:1 2 3 4 5 6 7 8 9......

当numRows=2时:输出:

1 3 5 7 9....

2 4 6 8 10...

当numRows=3时:输出:

1   5      9。。

2 4 6 8 10..

3    7     11..

当numRows=4时:输出:

1        7             13...

2     6 8         12 14...

3   5   9     11     15....

4        10            16...

这样我们可以看出(行按1开始计算):

1 第i行的第一个元素输出i

2 第1行和最后一行相邻两个元素之间的差距是2*(numRows-1)

3 除第一行和最后一行外的各行,相邻两个元素之间的差距按2*(numRows-1)和2*(i-1)交替

根据以上3 个结论很容易得到上面的代码。

posted on 2016-11-22 16:18  lichao_normal  阅读(92)  评论(0)    收藏  举报