z字形变换

z字形变换

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

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

P   A   H   N
A P L S I I G
Y   I   R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

(1)二维矩阵模型

这种解法是官方给出的一种方法,在开始解体之前先要进行数学分析

class Solution {
    public String convert(String s, int numRows) {

        //首先判断边界值,定义好n 和r
        //如果数组的长度为一  或者 行数值大于数组的长度值 那么直接返回改数组
        int n = s.length(), r = numRows;
        if(r == 1 || r >= n){
            return s;
        }

        //定义z字行变换的周期   变化的周期为2 * r - 2
        //以及 字符串进行z字变化之后所产生的列数  c = (n + t - 1) / t * (r - 1);
        int t = 2 * r - 2;
        int c = (n + t - 1) / t * (r - 1);

        //定义一个二维数组分别表示 进行z字变化之后的行和列
        char[ ][ ] mat = new char[r][c];

        //for循环开始遍历这个数组
        for(int i = 0, x = 0, y = 0; i < n; ++i){
            //将下标为i的数组中的字符放入 二维数组 mat[x][y] 中
             mat[x][y] = s.charAt(i);
             //判断如果在一个周期之内 则进行列变化 
            if(i % t < r - 1){
                //即将数组中的x值所表示的列向下移动
                ++x;
                //否则则将数组中对应的值向右移动 并且 行所对应的x的值向上移动 列所对应的y的值向右移动
            }else{
                --x;
                ++y;
            }
        }

        //进行完上面的操作之后,然后将新的在二维数组中的非空字符进行扫描 并且组成答案
        //使用java 下的StringBuilder类 对字符串进行操作
        StringBuilder ans = new StringBuilder();

        //使用增强型for循环开始遍历二维数组
        
        for(char[] row : mat){
            /*
            第一层遍历的时候因为二维数组中的每一个元素都是一个数组,所以遍历应将每个元素(数组)遍历到
            一个新的数组中
         */

            for(char ch : row){
                /*
                第二层遍历由于第一层遍历完成后,每个元素都是一个一维数组,则只需要使用一个变量来遍历
                数组中的每个元素,然后进行输出即可
             */
             //判断非空的字符 然后将字符加入到ans这个数组中
                if(ch != 0){
                    ans.append(ch);
                }
            }
        }
        //返回新的字符串
        return ans.toString();

    }
}

参考链接LeetCode

posted @ 2022-05-22 23:06  Root-RockMan  阅读(112)  评论(0编辑  收藏  举报