6.Z 字形变换
题目
6.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);
解题
主要在于找规律,假设,给定行数 numRows = 3,字符串 s = PAYPALISHIRING
排列成 Z 字,将每个字符安一定顺序放入 3 个数组即可。
数组 1: P A H N
数组 2: A P L S I I G
数组 3: Y I R
PAYPALISHIRING
12321232123212
1
2
3
4
5
6
2
3
4
5
6
解题步骤:
- 初始化 给定行数 numRows 个数的数组,表示对应的行,用于 Z 字排列的字符
- 初始化 row、step。row 表示放入第几个行,step 表示步数 +1 或者 -1
- 循环字符串放入对应的行中,到底最后一行或第一行时,step 反转
- 将每行拼接为一行,返回结果
go
func convert(s string, numRows int) string {
if numRows == 1 {
return s
}
rows := make([][]rune, numRows)
row, step := 0, 1
for _, c := range s {
rows[row] = append(rows[row], c)
row += step
if row == 0 || row == numRows-1 {
step *= -1
}
}
result := ""
for _, r := range rows {
result += string(r)
}
return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24