将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"
示例 2:
输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入: s = "A", numRows = 1
输出: "A"
提示:
1 <= s.length <= 1000s由英文字母(小写和大写)、','和'.'组成1 <= numRows <= 1000
解答:
实际上,本题是一道偏向计算的题,我们需要注意到,每个元素应该放到第i%(2*(numRows-1))行,因此,只需要遍历字符串并将其放到合适的行数中,最后合并字符串即可。
func convert(s string, numRows int) string {
strs := make([][]byte, numRows)
n := 2 * (numRows - 1)
if n == 0 {
return s
}
j := 0
for i, v := range s {
strs[j] = append(strs[j], byte(v))
if i%n >= numRows-1 {
j--
} else {
j++
}
}
return string(bytes.Join(strs, nil))
}