Z 字形变换

tech2024-03-16  65

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(); } }
最新回复(0)