题目: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 RAnd 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"
.
结题思路:
分二种情况,拿nRows=3举例,经观测得第一行和最后一行规律相同,第二行跟其他行有区别.因此我们分别找出他们的规律即可。
首先,第一行很容易得到每个字母所在字符串的位置:[0,4,8,12],那后面两行只要每次平移1位就能得到位置,不同的是中间一行多了几个字母.因此,找到中间行的规律。即可
public String convert(String s, int numRows) {
if(s.length()<=numRows||numRows==1) return s;
int middleNum =numRows-2;
String str="";
ArrayList<Integer> list =new ArrayList<Integer>();
for(int i=0;i<numRows;i++){
if(i==0){
int index=i;
while(index<s.length()){
list.add(index);
str+=s.charAt(index);
index+=numRows-i+middleNum;
}
}
else if(i==numRows-1){
for(int index:list){
if(index+i<s.length())
str+=s.charAt(index+i);
}
}
else{
for(int index:list){
if(index+i<s.length()){
str+=s.charAt(index+i);
if(index+2*numRows-i-2<s.length())
str+=s.charAt(index+2*numRows-i-2);
}
}
}
}
return str;
}
第一次写,写得不好请见谅。好像我的写麻烦了,等我想到好的方法,继续补上去。欢迎评论~~~