6. Z 字形变换
1、参考资料
https://leetcode-cn.com/problems/zigzag-conversion/
2、题目描述
题目要求
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z
字形排列。
比如输入字符串为 "LEETCODEISHIRING"
行数为 3
时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
3、代码思路
由于最后输出的结果需要按行输出,所以我们使用 List<StringBuilder> rows
来存储结果,比如
L C I R
E T O E S I I G
E D H N
遍历完成后, rows
中存储的内容为
LCIR
ETOESIIG
EDHN
然后我们将 rows
中的内容,使用 StringBuilder
拼接,然后返回即可
关键点:
rowIndex
为集合 rows
的行索引,dir
用于记录方向,1
表示向下,-1
表示向上
初始化 rowIndex = 0
,dir = 1
,此时 rowIndex
从上往下走,在之后的步骤中,rowIndex
应该在增大和减小之间不断重复
当 rowIndex >= rows.size() - 1
时,说明 rowIndex
触底,应该反弹,之后 rowIndex
应该减小
当 rowIndex <= 0
时,rowIndex
触顶,应该反弹,之后 rowIndex
应该增大
4、代码实现
代码
/**
* @ClassName ZConvertDemo
* @Description TODO
* @Author Heygo
* @Date 2020/9/3 16:20
* @Version 1.0
*/
public class ZConvertDemo {
public static void main(String[] args) {
Solution solution = new Solution();
String convertStr = solution.convert("LEETCODEISHIRING", 3);
System.out.println(convertStr);
}
}
class Solution {
public String convert(String str, int numRows) {
// Guard safe
if (numRows == 1) {
return str;
}
// 每一行都是一个 StringBuilder 对象
List<StringBuilder> rows = new ArrayList<>();
// 创建 ArrayList 中的 StringBuilder 对象
for (int i = 0; i < Math.min(str.length(), numRows); i++) {
rows.add(new StringBuilder());
}
int dir = 1; // 1 表示向下,-1 表示向上
int rowIndex = 0; // 行索引
// 遍历字符串中每个字符
for (char c : str.toCharArray()) {
rows.get(rowIndex).append(c); // 将字符添加至对应行中
if (rowIndex >= rows.size() - 1) { // 行索引触底反弹
dir = -1;
} else if (rowIndex <= 0) { // 行索引触底反弹
dir = 1;
}
rowIndex += dir;
}
// 拼接结果
StringBuilder result = new StringBuilder();
for (StringBuilder row : rows) {
result.append(row);
}
return result.toString();
}
}