006-Z 字形变换

Description

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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);

Example
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"


输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G
Solution

解题时把结果看成一个长度为numRows的字符串数组,根据Z字结构,判断插入条件,取模为0时必插入, 不为0时,需要在line和row之和等于numRows-1时插入

func convert(s string, numRows int) string {
    if numRows == 1 {
        return s
    }
    if len(s) <= numRows {
        return s
    }
    list := make([]string,numRows)
    index := 0
    left := 0
    for left < len(s){
        for i := 0;i < numRows; i ++ {
            if left >= len(s) {
                break
            }
            j := index%(numRows - 1)
            if j == 0 {
                item := list[i]
                item = item + string(s[left])
                left++
                list[i] = item
            }else if i == numRows - 1 - j{
                item := list[i]
                item = item + string(s[left])
                left++
                list[i] = item
            }
        }
        index++
    }
    return strings.Join(list,"")
}

格式化输出
func convertFormat(s string, numRows int) string {
    if numRows == 1 {
        return s
    }
    if len(s) <= numRows {
        return s
    }
    list := make([]string,numRows)
    index := 0
    left := 0
    for left < len(s){
        for i := 0;i < numRows; i ++ {
            if left >= len(s) {
                break
            }
            j := index%(numRows - 1)
            if j == 0 {
                item := list[i]
                item = item + string(s[left])
                left++
                list[i] = item
            }else if i == numRows - 1 - j{
                item := list[i]
                item = item + string(s[left])
                left++
                list[i] = item
            }else {
                item := list[i]
                item = item + " "
                list[i] = item
            }
        }
        index++
    }
    return strings.Join(list,"\n")
}
Solution 02
func convert1(s string, numRows int) string {
    if numRows == 1 {
        return s
    }
    bLen := math.Min(float64(numRows),float64(len(s)))
    bytes := make([][]byte,int(bLen))
    goingDownFlag := false
    curRow := 0
    for _,v := range s {
        bytes[curRow] =  append(bytes[curRow],byte(v))
        if curRow == 0 || curRow == numRows - 1 {
            goingDownFlag = !goingDownFlag
        }
        if goingDownFlag {
            curRow++
        }else {
            curRow--
        }
    }
    result := ""
    for _,v := range bytes {
        result += string(v)
    }
    return result
}

leetCode地址