Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
1
2
3
2
3
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
1
2
3
4
5
6
7
2
3
4
5
6
7
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
if (numRows === 1) return s
let start = 0
let isSlash = false
let resArr = []
let resStr = ""
while (start < s.length) {
if (!isSlash) {
resArr.push(s.slice(start, start + numRows))
start += numRows
isSlash = true
} else {
resArr.push('_' + s.slice(start, start + numRows - 2) + '_')
start += numRows - 2
isSlash = false
}
}
for (let j = 0; j < numRows; j++) {
for (let i = 0; i < resArr.length; i++) {
if (i % 2 === 0) {
resStr += resArr[i][j]
} else {
resStr += resArr[i][numRows - j - 1]
}
}
}
return resStr.replaceAll('_', '').replaceAll('undefined', '')
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
if (numRows === 1) return s;
let resArr = new Array(numRows).fill("")
let isGoingDown = false
let currentIndex = 0
for (let i = 0; i < s.length; i++) {
resArr[currentIndex] += s[i]
if (currentIndex === 0 || currentIndex === numRows - 1) isGoingDown = !isGoingDown
currentIndex += isGoingDown ? 1 : -1
}
return resArr.join("")
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zigzag-conversion