leetcode:ZigZag Conversion 曲线转换

Question:

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

字符串"PAYPALISHIRING"就像以下“Z”形排列

P   A   H   N
A P L S I I G
Y   I   R  所要得到的字符串按横行的顺序依次排列,这个字符串要求得到"PAHNAPLSIIGYIR"

给定string convert(string text, int nRows)这个函数,你需要写代码完成这个转换,nRows可以为任意正整数。

设计思想:1、对Rows的情况进行讨论,当Rows=1或者字符串text的长度<nRows,那么可以确定字符串还是顺序输出;

              2、如果nRows=2,那么首先要获得text字符串偶数位置上的字母,然后获得奇数位置上的字母;

              3、如果nRows>2且字符串长度>nRows,设计一个mark数组用来标记在字符串会在第几行,比如mark[k]=i,意思是第K个字母会在第i行。通过设置一boolean变量bool,来控制字符串移动方向,通过设置i来控制换行。

              4、最后根据mark标记数组中的内容,分别添加第0行、1行一直到nRows行的字母到str中,并返回。

代码实现(java)

 1 class Solution6 {
 2     public String convert(String s, int nRows) {
 3             String str="";
 4             if(0==nRows||1==nRows||s.length()<=nRows)
 5                 return s;
 6             if(2==nRows){
 7                 for(int i=0;i<s.length();i+=2)
 8                     str+=s.charAt(i);
 9                 for(int i=1;i<s.length();i+=2)
10                     str+=s.charAt(i);
11                 return str;
12             }
13             int i=0,k=0;
14             boolean bool=false;
15             Integer []mark=new Integer[s.length()];
16             while(k<s.length()){
17                 mark[k++]=i;
18                 if(i==nRows-1){
19                     bool=true;
20                     }
21                 else if(i==0){
22                     bool=false;
23                 }
24                 if(!bool)
25                     i++;
26                 else if(bool)
27                      i--;
28             }
29             k=0;i=0;
30             while(i<nRows){
31                 while(k<s.length()){
32                     if(i==mark[k]){
33                         mark[k]=-1;
34                         str+=s.charAt(k);
35                     }
36                     k++;
37                  }
38                 k=0;
39                 i++;
40             }
41             return str;
42     }
43 }
View Code

2013-10-04

 

 

posted @ 2013-10-04 12:00  般若一号  阅读(593)  评论(1编辑  收藏  举报