思路:
1.首先要有一个列表rows存储所有的数据,列表里每一个元素代表题中的一行,每一行里面的元素都是不断往里面加进去的,不是初始化好的。所以列表的每个元素,也就是每一行,应该用StringBuilder。按照题意rows总共numRows行,下标是0到numRows-1
2.其次,在边界处如何处理?如题意,假如总共4行,也就是numRows=4。从第一个字符开始,把每一个字符放到rows列表的其中一层,第一个字符第一层,第二个字符第二层。。。行数是递增的。rows总共应该有4层。到第四层时,该转向了,第五个元素,应该放到第3层里。之后第六个在第二层。。。到了行数为1时,又该转为行数递增了。。。所以,用flag表示当前行数递增还是递减,flag为1或者-1.
3.最后,遍历rows里的每一行,建立一个StringBuilder res,存放最终结果。把每一行都相继append到res里面。因为要返回String类型,要用到StringBuilder的toString()函数。
class Solution { public String convert(String s, int numRows) { if(numRows==1)return s; int flag=-1;//表示行的趋势,是增加还是减少 int j=0; List<StringBuilder> rows=new ArrayList<>();//这个列表存放所有的数据,每个列表元素代表一行,总共numRows行 for(int i=0;i<numRows;i++)//总共有多少行,就初始化多少个StringBuilder { rows.add(new StringBuilder()); } for(char c:s.toCharArray())//把String变成数组 { if(j==0||j==numRows-1)//此时说明,要么在第一行,要么在最后一行,要转向了 { flag=-flag; } rows.get(j).append(c);//根据下标获取ArrayList里面某一行的数据,也就是一个StringBuilder,之后append往里面加字符 j+=flag; } StringBuilder res=new StringBuilder();//结果集合里需要不断加入数据,而且rows里面每一行都是StringBuilder数据,所以这里res也是StringBuilder for(StringBuilder row:rows) { res.append(row); } return res.toString(); } }
我的博客里还有ArrayList的用法介绍,虽然是转载的。。。还有StringBuilder的介绍。要是看不懂一些用法,可以看看。