题目:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”PAHNAPLSIIGYIR”。
解题:
两列分成一组,第一列为0~n,第二列为n-1~1,然后把他们放入数组合并即可,一行时直接返回原字符串
代码:
func convert(s string, numRows int) string {
if numRows == 1 {
return s
}
strArr := make([]string, numRows)
l := 2*numRows - 2
for i := range s {
j := i % l
if j < numRows {
strArr[j] = strArr[j] + string(s[i])
} else {
strArr[l-j] = strArr[l-j] + string(s[i])
}
}
return strings.Join(strArr, "")
}
官方解答:
func convert(s string, numRows int) string {
n, r := len(s), numRows
if r == 1 || r >= n {
return s
}
t := r*2 - 2
ans := make([]byte, 0, n)
for i := 0; i < r; i++ { // 枚举矩阵的行
for j := 0; j+i < n; j += t { // 枚举每个周期的起始下标
ans = append(ans, s[j+i]) // 当前周期的第一个字符
if 0 < i && i < r-1 && j+t-i < n {
ans = append(ans, s[j+t-i]) // 当前周期的第二个字符
}
}
}
return string(ans)
}