Z 字型变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
1
2
3
| P A H N
A P L S I I G
Y I R
|
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”
解
这一题没有什么算法思想,考察的是对程序控制的能力。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| func convert(s string, numRows int) string {
step := numRows*2 - 2 // 到达下一层要跳转的步长
if step <= 0 {
return s
}
result := make([]byte, 0)
for i := 0; i < numRows; i++ {
// 遍历每一层
for j := i; j < len(s); j = j + step {
// 控制步长来遍历一层中的每一个元素
result = append(result, s[j])
row := j%step + 1 // j所在层数 以1为始
if row > 1 && row <= numRows-1 && j+(numRows-row)*2 < len(s) {
// 添加z型拐弯处的字母
result = append(result, s[j+(numRows-row)*2])
}
}
}
return string(result)
}
|