皆さん こんばんは。
好久么得做题了~今天的题是一个找规律的题目。题意是说要把一个字符串写成锯齿形。这是什么意思呢?题目中给了一个例子。比如对于字符串”PAYPALISHIRING”,就应该写成:
1 2 3
| P A H N A P L S I I G Y I R
|
然后再拉成一行,变成”PAHNAPLSIIGYIR”。
所以我们可以通过找规律的方式发现,这个字符串是具有周期性的,周期为2*nRows-2,其中nRows表示要转换成nRows行的锯齿形。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| char* convert(char* s, int numRows) { if(numRows == 1) return s; int i, j, count = 0; int len = strlen(s); char* c = (char*)malloc(len+1); int add = 2*numRows - 2; for(i = 0; i < numRows; i++){ for(j = i; j < len; j+=add){ c[count++] = s[j]; if(i > 0 && i < numRows-1){ int t = j + add - 2*i; if(t < len) c[count++] = s[t]; } } } c[count++] = 0; return c; }
|
注意在第18行我们有一个特殊的处理,如果不加上这个的话,会在正确答案后面继续输出奇怪的结果(字符串要以’\0’结尾,这个就是我们额外加的结尾)。
另外还要注意如果不是第一行或最后一行,还有倒着的一个循环节。要额外处理一下。