问题描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"解释:
L D R
E O E I I
E C I H N
T S G解题
解题思路
设置numRows个数组(以下程序中用切片实现),根据规律,依次将元素放入数组中,最后合并各个数组。
源程序(Go)
//Convert Z字型变换
func Convert(s string, numRows int) string {
if utf8.RuneCountInString(s) <= 1 || numRows == 1 {
return s
}
list := make([][]byte, numRows) //不能是: var list [numRows][]byte
var result []byte
index := 0
flag := 1
for i := 0; i < utf8.RuneCountInString(s); i++ {
list[index] = append(list[index], s[i])
if flag == 1 {
index++
} else {
index--
}
if index == 0 || index == numRows-1 {
flag = -flag //flag标签实现方向反转,放入数组
}
}
for i := 0; i < numRows; i++ {
for j := 0; j < utf8.RuneCount(list[i]); j++ {
result = append(result, list[i][j])
}
}
return string(result)
}