力扣刷题day6--Z字形变换

43 篇文章 0 订阅
这篇博客详细介绍了如何解决字符串的Z字形变换问题,通过分析周期性和元素移动规律,提出了一种使用数组存储的解决方案。代码中展示了如何通过计算周期、确定元素移动方向来实现变换,并给出了具体的Java实现。这种方法巧妙地处理了不同位置元素的放置,有助于理解此类问题的解题思路。
摘要由CSDN通过智能技术生成

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();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值