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