P A H N A P L S I I G Y I RAnd 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 | 7 | 9 | 15 | 17 | |||||||
2 | 6 | 10 | 14 | 18 | |||||||
3 | 5 | 11 | 13 | 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