本题主要是一层层字符对象的创建对应问题。
首先针对题目可以发现一个规律:如果numRows=4,字符s按照1234321234321这样循环排列,然后再组成新字符ans时,保持11122233344,也就是说需要将s中的每个字符和和他对应的位置数字保持对应(我没找到如何只用java的原有库就解决这个问题,因为键值会重复)。
答案是将111、222、333、44对应成四个StringBuilder的对象,而这四个StringBuilder由一个ArrayList的对象维护。
所以对应的关系是:ArrayList对象->StringBuilder对象->String字符
首先创建一个ArrayList对象,并且在其中添加四个StringBuilder对象
ArrayList <StringBuilder>rows = new ArrayList<>();
for(int i = 0;i < numRows;i++){
rows.add(new StringBuilder());
}
然后开始依次向这四个StringBuilder中添加字符,设置flag标志位以及num_rows表示当前字符对应的位置。
int num_rows = 0;
int flag = -1;
char c[] = s.toCharArray();
for(int i = 0;i < c.length;i++){
//从rows中get出一个StringBuilder对象,对这个对象append字符
rows.get(num_rows).append(c[i]);
//举例来说,当NumRow=4时,当num_rows=0和nums_rows=3时,需要进行换向
if(num_rows == 0 || num_rows == numRows - 1){
flag = -flag;
}
num_rows = num_rows + flag;
}
最后在定义一个StringBuilder对象,将四个StringBuilder对象拼起来。
StringBuilder ans = new StringBuilder();
for(int i = 0;i < numRows;i++){
ans.append(rows.get(i));
}
return ans.toString();
代码总体如下:
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2){return s;}
ArrayList <StringBuilder>rows = new ArrayList<>();
for(int i = 0;i < numRows;i++){
rows.add(new StringBuilder());
}
int num_rows = 0;
int flag = -1;
char c[] = s.toCharArray();
for(int i = 0;i < c.length;i++){
rows.get(num_rows).append(c[i]);
if(num_rows == 0 || num_rows == numRows - 1){
flag = -flag;
}
num_rows = num_rows + flag;
}
StringBuilder ans = new StringBuilder();
for(int i = 0;i < numRows;i++){
ans.append(rows.get(i));
}
return ans.toString();
}
}