Z 字形变换

488 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

1.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);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

解题:

可以理解为字符串是按V字型追加的,V字的高度就是numRows,可以定义一个字符串数组,然后依次从上到下,从下到上的反复往行字符串追加字符。假如行数是3,依个遍历字符串s,那么第一个字符追加到第一行的字符串,第二个字符追加到第二行的字符串,第三个字符追加到第三行的字符串,此时已经到达最大行数了,第四个字符串就往上去第二行字符串追加,第五个字符串就追加到第一行,这个时候也就到达最开始的位置了,第六个字符串就又需要往下一行追加,如此反反复复直到字符串遍历完,最后将整个数组从上到下拼接成一行就行了。

public String convert(String s, int numRows) {
    if (numRows == 1) {
        return s;
    }
    // 定义初始化字符串数组
    StringBuilder[] strArr = new StringBuilder[numRows];
    for (int i = 0; i < numRows; i++) {
        strArr[i] = new StringBuilder();
    }

    // 代表数组下标
    int index = 0;
    // 是否到头了
    boolean top = true;
    for (int i = 0; i < s.length(); i++) {
        // 往数组数组里面添加字符
        strArr[index].append(s.charAt(i));

        // 如果在第一行 那么应该是往下 ++
        if (index == 0) {
            top = true;
        }
        // 如果在最后一行 那么应该是往上 --
        if (index == numRows - 1) {
            top = false;
        }
        // 依次从第一行追加到最后一行,从最后一行追加到第一行,反反复复
        index = top ? index + 1 : index - 1;
    }
    // 将数组从左到右,从上到下拼接成一行
    StringBuilder res = new StringBuilder();
    for (int i = 0; i < numRows; i++) {
        res.append(strArr[i]);
    }
    return res.toString();
}