6. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
辅助矩阵
class Solution {
public String convert(String s, int numRows) {
int n = s.length(), r = numRows;
if (r == 1 || n <= r) {
return s;
}
int t = 2 * r - 2;
int c = (n + t - 1) * t / (r - 1);
char[][] tmp = new char[r][c];
for (int i = 0, x = 0, y = 0; i < s.length(); ++i) {
tmp[x][y] = s.charAt(i);
if (i % t < r - 1) {
x++;
} else {
x--;
y++;
}
}
StringBuilder ans = new StringBuilder();
for (int i = 0; i < tmp.length; ++i) {
for (int j = 0; j < tmp[0].length; ++j) {
if (tmp[i][j] != 0) {
ans.append(tmp[i][j]);
}
}
}
return ans.toString();
}
}
压缩矩阵
class Solution {
public String convert(String s, int numRows) {
int n = s.length(), r = numRows;
if (r == 1 || n <= r) {
return s;
}
int t = 2 * r - 2;
int c = (n + t - 1) * t / (r - 1);
StringBuilder[] tmp = new StringBuilder[r];
for (int i = 0; i < tmp.length; ++i) {
tmp[i] = new StringBuilder();
}
for (int i = 0, x = 0; i < s.length(); ++i) {
tmp[x].append(s.charAt(i));
if (i % t < r - 1) {
x++;
} else {
x--;
}
}
StringBuilder ans = new StringBuilder();
for (int i = 0; i < tmp.length; ++i) {
ans.append(tmp[i]);
}
return ans.toString();
}
}
数学
class Solution {
/**
* 直接构造
*/
public static String convert(String s, int numRows) {
int n = s.length();
if (n <= numRows || numRows == 1) {
return s;
}
//每次向下和向右上移动为一个周期, 一个周期内的元素个数为 numRows + numRows - 2
int t = 2 * numRows - 2;
StringBuilder sb = new StringBuilder(n);
//每一行
for (int i = 0; i < numRows; i++) {
//每一个周期, j为该周期的起点, i+j为该行该周期第一个点
for (int j = 0; i + j < n; j += t) {
//拼接每个周期的第一个点
sb.append(s.charAt(i + j));
//拼接每个周期的第二个点(若有时), 第二个点索引为 j + t - i
if (i != 0 && i != numRows - 1 && j + t - i < n) {
sb.append(s.charAt(j + t - i));
}
}
}
return sb.toString();
}
}
//0 6 12
//1 5 7 11
//2 4 8 10
//3 9
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号