题目:给定一个字符串s,一个整数numRows, 将字符串s按照竖Z的方式排列,然后输出结果;
举例:String s = "PAYPALISHIRING";
排列后为:
P A H N A P L S I I G Y I R
String convert(String s, int 3) 结果为"PAHNAPLSIIGYIR"
解题思路:
1. 由于每一行到底有多少个字母是不确定的,因此每行使用ArrayList来保存字母;如5,6,7行代码所示;
2. 遍历字符串:分为三个部分:第一部分(第13行代码)循环,即从上往下走;第二部分条件判断(第18行代码),判断从上往下走是否已经到达最下层,若到达,下一步应该往上走,因此ArrayList的标号应该减2;第三部分循环(第21行代码),是从下往上走;
3. 遍历结束时,list[0]中保存的是第一行的字符串,list[1] 中保存的是第二行字符串,以此类推......
代码如下:
1 public class Solution { 2 public String convert(String s, int numRows) { 3 if(s == null || s.length() < 1 || numRows <= 1) 4 return s; 5 List<List> list = new ArrayList<List>(); 6 for(int i = 0; i < numRows; i++){ 7 list.add(new ArrayList<Character>()); 8 } 9 int index = 0; // 判断是第几个ArrayList,即是第几行 10 int i = 0; 11 int len = s.length(); 12 while(i < len) { 13 while(index < numRows && i < len){ 14 list.get(index).add(s.charAt(i)); 15 index ++; 16 i++; 17 } 18 if(index == numRows){ 19 index -= 2; 20 } 21 while(index > 0 && i < len){ 22 list.get(index).add(s.charAt(i)); 23 i++; 24 index --; 25 } 26 27 } 28 StringBuffer sb = new StringBuffer(); 29 for(int j =0; j < list.size(); j++){ 30 for(int k = 0; k < list.get(j).size(); k++){ 31 sb.append(list.get(j).get(k)); 32 } 33 } 34 return sb.toString(); 35 } 36 }