解法一:
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2){//一行的直接返回原字符串即可
return s;
}
StringBuilder[] row = new StringBuilder[numRows];//这个只是创建了numRows个字符串的引用
for(int i = 0; i < row.length; i++){
row[i] = new StringBuilder();//每一个引用还要创建具体的字符串对象,java数组需要注意这个,区分对象和基本类型
}
boolean upOrDown = true;//upOrDown为true时代表在向下挪动row,反之代表在向上挪动row
int nowMove = 0;//代表现在移动到了第几行
for(int i = 0; i < s.length(); i++){
char get = s.charAt(i);
if(upOrDown){//代表在向下移动
row[nowMove++].append(get);//向第nowMove行的字符串增加
} else{
row[nowMove--].append(get);//代表在向上移动
}
if(nowMove >= numRows || nowMove <= -1){//因为处理完了这一行再自增、自减的,所以需要多超过1的限度
upOrDown = upOrDown ^ true;//取反
//取反了还要修改nowMove的值,变化量是2,因为之前已经取了第一个和最后一个
//只能针对行数大于等于2的,否则会越界
nowMove = nowMove >= numRows ? nowMove-2 : nowMove+2;
}
//System.out.println(nowMove);
}
StringBuilder res = new StringBuilder();
for(int i = 0; i < numRows; i++){//按横排整理结果字符串
res.append(row[i]);
}
return res.toString();
}
}