解题思路:
1、画出原字符串,变换后的字符串,以及变换过程,找寻规律。
2、考虑numRows==1的情况,如果numRows==1,那么直接返回字符串s。
3、在zigzag型字符串中找出循环大小的字符串序列。对于每个输入的numRows,确定循环串的大小(形状上循环而不是内容上循环)。
4、通过java的tocharArr()方法,把字符串转换为字符数组。
5、建立numRows个Character类型的ArrayList并把它们加到一个大的List中。每个ArrayList对应转换后的一行。每个ArrayList添加字符的顺序对应转换后每行的字符的顺序。
6、用index%rotateSize的方式确定该字符在它所在的循环串中的位置,记为k。如果k<=numRows-1,那么说明该字符在竖行上,直接把它加入到下标为k的Character类型的ArrayList中;如果k>numRows-1,那么说明该字符在斜行上,用queNum=numRows-1-k%(numRows-1)的方式来计算它所对应的Character类型的ArrayList的下标,并将它加入其中。
7、把大的List中的元素,按从上到下,从左到右的顺序加入到字符串ss=""中,最后,返回ss。
犯的错误:
忘记考虑numRows==1的情况了。
代码:
class Solution {
public String convert(String s, int numRows) {
if(numRows==1) return s;
List<List<Character>> ls=new ArrayList<List<Character>>();
for(int i=0;i<numRows;i++) {
List<Character> a=new ArrayList<Character>();
ls.add(a);
}
char[] sarr=s.toCharArray();
int rotateSize=2*(numRows-1);
for(int i =0;i<sarr.length;i++) {
int k=i%rotateSize;
if(k<=(numRows-1)) {
List<Character> b=ls.get(k);
b.add(sarr[i]);
}else {
int queNum=numRows-1-k%(numRows-1);
List<Character> b=ls.get(queNum);
b.add(sarr[i]);
}
}
String ss="";
for(int j=0;j<ls.size();j++) {
for(int m=0;m<ls.get(j).size();m++) {
char a=ls.get(j).get(m);
ss+=a;
}
}
return ss;
}
}