概述
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字形变换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复