题目:
由题可得是给我们一个字符串和一个指定行数,让我们先把字符排成z字形(从上往下),最后再从左往右读取。因为目前我们知道行数是已知的,所以我们可以使用列表来储存每一排的字符,因为是一个个遍历再添加的,我们可以使用StringBuilder来进行字符串的拼接。
代码如下:
class Solution {
public String convert(String s, int numRows) {
// 如果只有一排的话直接返回原字符串
if(numRows<2){
return s;
}
// 创建一个列表来储存每一排z字形遍历到的字符,每一排的字符用StringBuilder储存,这样也方便后续字符的添加
List<StringBuilder> lists=new ArrayList<StringBuilder>();
// 有几排就创建几个StringBuilder
for(int i=0;i<numRows;i++){
lists.add(new StringBuilder());
}
// 这里的index是用来摆放z字形顺序时,当前需要摆放字符的坐标
// flag则是用来让当index遍历到列表头部或者尾部时,需要让index掉头遍历,index的前进与后退与flag的值有关
int index=0,flag=-1;
// 遍历s字符串
for(int i=0;i<s.length();i++){
// 没有遍历到头或者尾时正常放入
lists.get(index).append(s.charAt(i));
// 当遍历到了底部或者头部,需要让index掉头,即flag的值要变
if(index==0||index==numRows-1){
flag=-flag;
}
index+=flag;
}
// 创建一个新的StringBuilder来储存结果
StringBuilder result=new StringBuilder();
// 将列表中的字符串在一个个加给result
for(StringBuilder list:lists){
result.append(list);
}
return result.toString();
}
}