Cola Life long learning

LeetCode 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);

代码

class Solution {
    public String convert(String s, int numRows) {
        if(numRows < 2) return s;

        List<StringBuilder> rows = new ArrayList<StringBuilder>();

        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());

        int i = 0, flag = -1;

        for(char c : s.toCharArray()) {

            rows.get(i).append(c);

            if(i == 0 || i == numRows -1) flag = - flag;

            i += flag;

        }

        StringBuilder res = new StringBuilder();

        for(StringBuilder row : rows) res.append(row);
        
        return res.toString();

    }
}

代码解析

  1. 初始处理

    • if(numRows < 2) return s;:如果行数小于 2,直接返回原字符串,因为这种情况下没有必要进行 Z 字形排列。
  2. 初始化行列表

    • List<StringBuilder> rows = new ArrayList<StringBuilder>();:创建一个列表 rows,其中每个元素是一个 StringBuilder 对象,用于存储每行的字符。
    • for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());:向 rows 列表中添加 numRowsStringBuilder 对象,每个对象代表一行。
  3. 遍历字符串并填充行列表

    • int i = 0, flag = -1;:初始化行索引 i 和方向标志 flagi 表示当前字符要填充的行,flag 用于改变方向。
    • for(char c : s.toCharArray()) {:遍历字符串 s 的每个字符 c

      • rows.get(i).append(c);:将当前字符 c 添加到当前行 iStringBuilder 中。
      • if(i == 0 || i == numRows -1) flag = - flag;:当到达第一行或最后一行时,改变方向。
      • i += flag;:根据方向 flag 更新行索引 iflag 为 1 时向下移动,为 -1 时向上移动。
  4. 组合结果

    • StringBuilder res = new StringBuilder();:创建一个 StringBuilder 对象 res 用于存储最终结果。
    • for(StringBuilder row : rows) res.append(row);:遍历每个 StringBuilder 对象 row,将其内容添加到 res 中。
  5. 返回结果

    • return res.toString();:将结果 res 转换为字符串并返回。

示例

s = "PAYPALISHIRING"numRows = 3 为例:

  1. 初始状态

    • numRows = 3
  2. 初始化行列表

    • rows 列表中包含 3 个 StringBuilder 对象,每个对象初始化为空。
  3. 填充行列表

    遍历字符串并填充行列表的过程如下:

    P     A     H     N
    A P L S I I G
    Y     I     R

    具体过程为:

    • P (i=0)
    • A (i=1)
    • Y (i=2)
    • P (i=1)
    • A (i=0)
    • L (i=1)
    • I (i=2)
    • S (i=1)
    • H (i=0)
    • I (i=1)
    • R (i=2)
    • I (i=1)
    • N (i=0)
    • G (i=1)
  4. 组合结果

    • rows 中每个 StringBuilder 对象的内容按顺序连接起来,得到结果 PAHNAPLSIIGYIR

结果

最终返回字符串 "PAHNAPLSIIGYIR"

^