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 }
2013-10-04