LeetCode6 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".

观察

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

要处理的是两部分,直线0-1-2-3-4和斜线5-6-7,后面的都是这两个的重复,创建一个String数组ans=new  String[nRows]保存每行的字母,然后两个循环,一个for循环处理直线,一个处理斜线 

for(j=0;i<s.length()&&j<nRows;j++){
                ans[j]+=s.charAt(i);
                i++;
            }

 for(j=nRows-2;j>0&&i<s.length();j--){
                ans[j]+=s.charAt(i);
                i++;
            }

i表示原始字符串的下标,当i到达末尾时循环结束,这种方法简单易于理解,而且时间复杂度O(n).

 1 public String convert(String s, int nRows) {
 2         if(s.length()<=nRows||nRows==1)  //特殊情况处理
 3             return s;
 4         int i=0,j=0;
 5         int nRows_minus_ends=nRows-2;
 6         String[] ans=new String[nRows];
 7         for(int k=0;k<ans.length;k++)
 8             ans[k]="";
 9         while(i<s.length()){
10             for(j=0;i<s.length()&&j<nRows;j++){
11                 ans[j]+=s.charAt(i);
12                 i++;
13             }
14             for(j=nRows_minus_ends;j>0&&i<s.length();j--){
15                 ans[j]+=s.charAt(i);
16                 i++;
17             }
18         }
19         String ansString="";
20         for(int k=0;k<ans.length;k++)
21             ansString+=ans[k];
22         return ansString;
23     }
View Java Code

 

posted @ 2015-04-16 12:06  D_riv  阅读(130)  评论(0编辑  收藏  举报