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

时间:2022-05-16 17:06:14

题目:给定一个字符串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 }