Leetcode6>Zigzag Conversion(将给定字符串按照Z字排列,输出结果)

题目:给定一个字符串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 }
原文地址:https://www.cnblogs.com/leavescy/p/5878631.html