当前位置: 面试刷题>> Z 字形变换(经典算法150题)


题目描述

将字符串 s 按照 Z 字形变换排列后,返回按行读取的字符串数组。

字符串 s 的 Z 字形变换方式如下:

  1. 将字符串 s 的第一个字符放在第一行。
  2. 从第二个字符开始,按照 "Z" 字形排列剩余的字符,即字符按照 "V" 形的模式向下移动,直到达到该行的末尾,然后换行,并从下一行的开头继续这种模式,直到字符串的末尾。

示例:

输入: s = "PAYPALISHIRING" 输出: ["PAYPALISH", "IR", "ING"]

解释:

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

然后,我们按行读取字符:"PAYPALISH""IR""ING",并返回这些字符串作为数组。

PHP 示例代码

function convert(string $s, int $numRows): array {
    if ($numRows <= 1 || strlen($s) <= $numRows) {
        return [$s];
    }
    
    $result = array_fill(0, $numRows, '');
    $goingDown = false;
    $curRow = 0;

    for ($i = 0; $i < strlen($s); $i++) {
        $result[$curRow] .= $s[$i];
        if ($curRow == 0 || $curRow == $numRows - 1) {
            $goingDown = !$goingDown;
        }
        $curRow += $goingDown ? 1 : -1;
    }

    return $result;
}

// 示例用法
$s = "PAYPALISHIRING";
$numRows = 3;
$result = convert($s, $numRows);
print_r($result);

Python 示例代码

def convert(s: str, numRows: int) -> List[str]:
    if numRows <= 1 or len(s) <= numRows:
        return [s]

    result = ['' for _ in range(numRows)]
    curRow = 0
    goingDown = False

    for char in s:
        result[curRow] += char
        if curRow == 0 or curRow == numRows - 1:
            goingDown = not goingDown
        curRow += 1 if goingDown else -1

    return result

# 示例用法
s = "PAYPALISHIRING"
numRows = 3
print(convert(s, numRows))

JavaScript 示例代码

function convert(s, numRows) {
    if (numRows <= 1 || s.length <= numRows) {
        return [s];
    }

    const result = new Array(numRows).fill('');
    let curRow = 0;
    let goingDown = false;

    for (let char of s) {
        result[curRow] += char;
        if (curRow === 0 || curRow === numRows - 1) {
            goingDown = !goingDown;
        }
        curRow += goingDown ? 1 : -1;
    }

    return result;
}

// 示例用法
const s = "PAYPALISHIRING";
const numRows = 3;
console.log(convert(s, numRows));

这些示例代码均实现了 Z 字形变换的算法,并展示了如何按行读取并返回字符串数组。希望这些示例能对你有所帮助,并在你的码小课网站上发布时提供有价值的参考。

推荐面试题