006ZigZag Conversion (C)

来源:互联网 发布:手机千牛怎么进淘宝客 编辑:程序博客网 时间:2024/05/21 17:09


P   A   H   NA P L S I I GY   I   R
And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

做此题我的想法很简单,并没有去列出其中的规律,既然是之字型,那就用一个二维数组实现吧,就写了下面的程序,最后runtime竟然达到492ms

给了这么一句:you are here! your runtime beats 0.00% of c submissions(无语了,难道没有像我一样这样想的吗?)

char* convert(char* s, int numRows) {    char zig[numRows][strlen(s)];    int k,i,j,q;    if(s[0]=='\0'||numRows==1){    return s;    }    for(i=0;i<numRows;i++){    for(j=0;j<strlen(s);j++){    zig[i][j]='\0';    }    }    i=j=k=q=0;    while(s[k]!='\0'){    if(i<numRows){    zig[i++][j]=s[k++];    }else{    i--;    while(s[k]!=0&&i>0){    zig[--i][++j]=s[k++];    }    i++;    }    }    for(i=0;i<numRows;i++){    for(k=0;k<=j;k++){    if(zig[i][k]!='\0'){    s[q++]=zig[i][k];              }    }    }    return s;}

在网上搜了一下,发现确实应该找规律,借用一张图,便于理解

0   8   16   1  79  1517   2 6 10 14 18   35  1113  19   4   12   20   

nRows=5

需要按行输出每一个字符先看1,5,9,...列   (0,1,2,3,4),(8,9,10,11,12),(16,17,18,19,20) 

可以发现对应的行的变化相同为8,这样这些字符就确定了

但是除了首行和末行,中间的还有字符

第二行中间字符距前一个字符间隔为6....

第三行是4...

.....

附上此方法的程序(转载)

http://blog.csdn.net/ljiabin/article/details/40477429



0 0
原创粉丝点击