当前位置: 面试刷题>> 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 示例代码 ```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 示例代码 ```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 示例代码 ```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 字形变换的算法,并展示了如何按行读取并返回字符串数组。希望这些示例能对你有所帮助,并在你的码小课网站上发布时提供有价值的参考。
推荐面试题