我是靠谱客的博主 烂漫猫咪,最近开发中收集的这篇文章主要介绍力扣刷题day6--Z字形变换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Z字形变换题目如下所示:

是的,最开始看到这个题目的时候我的思路很模糊,我只知道我用数组进行求解应该可以解答,然后需要判断一个元素的特殊情况,最后没有思考出来。在参考了官方的答案之后,总计如下:

使用数组的方式

1. 首先对题目进行分析

我们使用r来接numRows的值,使用str来接s的值

2. 上面分析完之后,我们需要的就是怎么才能找到这个题目中的一些规律?

不难发现,此题目的Z字变换是按照周期进行的,所以我们可以先求出它的周期,周期t=r+r-2【因为第一列必定占用r行,而后没有达到Z字的竖线的位置的时候都只存放一个元素,所以相当于Z字的最上面和最下面都不会算进去】

因此我们会有num= str/t个周期【此时我们是将最后一个周期作为完整周期的】

然后我们会发现每个周期上会占用多少个列?想一想

是的,占用1+r-2列=r-1列

【补充:可能会有人想我为什么可以想到周期占用多少个列呢?因为你需要确定你的数组的行列数】

随后我们可以得到共num*(r-1)列

随后我们可以知道,当对应的下标位置 mod t小于r-1的时候,向下移动,否则向右上移动

只能说这个方法真的很妙!特别是判断位置的那里!

3. 代码如下所示:

class Solution {
    public String convert(String s, int numRows) {
        //Z字形变换,可以使用数组进行承装
        int n = s.length(), r = numRows;
        if (r == 1 || r >= n) {
            return s;
        }
        int t = r * 2 - 2;
        int c = (n + t - 1) / t * (r - 1);
        char[][] mat = new char[r][c];
        for (int i = 0, x = 0, y = 0; i < n; ++i) {
            mat[x][y] = s.charAt(i);
            if (i % t < r - 1) {
                ++x; // 向下移动
            } else {
                --x;
                ++y; // 向右上移动
            }
        }
        StringBuffer ans = new StringBuffer();
        for (char[] row : mat) {
            for (char ch : row) {
                if (ch != 0) {
                    ans.append(ch);
                }
            }
        }
        return ans.toString();

    }
}

最后

以上就是烂漫猫咪为你收集整理的力扣刷题day6--Z字形变换的全部内容,希望文章能够帮你解决力扣刷题day6--Z字形变换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部