leetcode 06 Z字形变换

49 阅读2分钟

题目:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

分析:这个题目有点像脑筋急转弯,只需要找到规律即可。我个人的思路是这样的,首先我们按照列观察,我们可以发现这是一个循环,类似于如下所示,后续就是该循环的无限重复,因此找到下述节点的规律,就能够完成该题的解答。

A           I
B        H
C     G
D  F
E 

详细的代码执行流程如下

1. 定义数组strings用于存放每一行的元素,并将数组的每个位置初始化为空
2. 将输入字符串转换为字符数组
3. 设置标志位,这个标志位标志上述循环的结束,开启下一轮循环;
4. 设置一个StringBuilder,因为在循环中使用StringBuilder进行字符串拼接会增加效率
5. 开始循环,其中i作为字符数组遍历标志位,j作为上图循环标志位
    -第一个if判断用于判断是否是处于第一列,如果处于在对应位置进行相加
    -第二个if判断用于判别是否位于循环第一列和最后一列的中间部分
    -最后一个判断,此时出于上述循环的最后一列,直接将元素添加进去,重置j的值;
6. 遍历String数组,将结果组合起来
7. 返回结果。
class Solution {
    public String convert(String s, int numRows) {
            String [] strings = new String[numRows];
            Arrays.fill(strings, "");
            char[] charArray = s.toCharArray();
            int flag = 2 * (numRows-1);
            StringBuilder stringBuilder = new StringBuilder("");
            for (int i = 0, j = 0; i < charArray.length; i++) {
                if(j <= numRows-1){
                    strings[j] += charArray[i];
                    j++;
                }
                else if(j < flag){
                    strings[flag-j] += charArray[i];
                    j++;
                }else {
                    strings[0] += charArray[i];
                    j = 1;
                }
            }
            for (String string : strings) {
                stringBuilder.append(string);
            }
            return stringBuilder.toString();
        }
}