【LeetCode】6. ZigZag Conversion

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   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".

这个题很简单,分级也是easy级别的,但是一个小bug差点把我逼疯,天知道我在想什么。

题意:把字符串Z字形排列,然后返回横向,也就是正常阅读方向的字符串。

思路:

首先观察Z字形排列的字符串的特点:

0       8
1     7 9
2   6   10
3 5     11
4       12
0   4  
1 3 5 7
2   6  

从图上可以看出,在最边上的两行,每两个相邻字符的索引相差2*numRows-2,同时,在其余行,两个平行行之间的三个字符,

相邻两个字符索引的差之和也为2*numRows-2。利用这个特点,解法就是:

 

 1 char* convert(char* s, int numRows) {
 2     int len=strlen(s);
 3     int gap,d,rd,i,j,k=0;
 4     char*tmp=malloc(sizeof(char)*(len+1));
 5     gap=2*numRows-2;
 6     d=gap;
 7     if(numRows!=1)
 8          for(i=0;i<numRows;i++)
 9         {
10             rd=d;
11             tmp[k++]=s[i];
12             if(i==numRows-1)
13                 rd=gap;
14             for(j=i+rd;j<len;j=j+rd)
15                 {
16                     tmp[k++]=s[j];
17                     if(i!=0&&i!=numRows-1)
18                         rd=gap-rd;        //关键在这个,
19                 }
20             d-=2;
21         }
22     else
23     {
24         k=0;
25         while(k<len)
26             {
27                 tmp[k]=s[k];
28                 k++;
29             }
30     }
31             tmp[k]='\0';
32     return tmp;
33 }

 

posted @ 2016-12-18 16:19  wilderness  阅读(171)  评论(0编辑  收藏  举报