皆さん こんばんは。

好久么得做题了~今天的题是一个找规律的题目。题意是说要把一个字符串写成锯齿形。这是什么意思呢?题目中给了一个例子。比如对于字符串”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’结尾,这个就是我们额外加的结尾)。

另外还要注意如果不是第一行或最后一行,还有倒着的一个循环节。要额外处理一下。