[LeetCode-Golang] 6. Z 字形变换
题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
用[]bytes.Buffer来记录每一行的元素,最后将[]bytes.Buffer拼接起来。
遍历整个字符串,将每个字符添加到相应的bytes.Buffer中,注意当前行 为0或者numRows-1时,移动的方向发生改变。
复杂度分析
时间复杂度: O(n)
空间复杂度: O(n)
代码
func convert(s string, numRows int) string { // 特殊情况 if len(s) < 1 || numRows == 1 { return s } // 创建bytes.Buffer切片,长度为numRows bufs := make([]bytes.Buffer, numRows) // flag标志着往上走还是往下走,往下走为1,往上走为-1 flag := -1 curr := 0 for i := 0; i < len(s); i++ { bufs[curr].WriteByte(s[i]) if curr == 0 || curr == numRows-1 { flag = -flag } curr += flag } var ans bytes.Buffer for _, v := range bufs{ ans.Write(v.Bytes()) } return ans.String() }