6.N字形变换
方法:使用二维矩阵模拟
根据题意,当在矩阵中填写字符时,会向下填写r个字符,然后向右继续填写r - 2个字符,最后回到第一行,因此Z字形变换的周期是t = r + r - 2 = 2r - 2,是|/,每个周期占用矩阵上的 1+r - 2 = r - 1列。
因此有n/t个周期(最后一个周期视为完整周期),乘上每个周期的列数,得到矩阵的列数
注意在这里取了向上取整
创建一个r行c列的矩阵,遍历字符串s,按照Z字形编写
class Solution {
public String convert(String s, int numRows) {
int n = s.length(), r = numRows; //行数
if( r == 1 || r >= n){
return s;
}
int t = r * 2 - 2; //Z字形变换的周期|/ 每个周期占用矩阵r-1列
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();
}
}