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