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