目录

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)
}