美文网首页
Z字形变换-leetcode

Z字形变换-leetcode

作者: 萍水间人 | 来源:发表于2020-02-13 15:40 被阅读0次

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

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

可以用一个二维切片来模拟这个过程,先往下填入 LEE 到了最底部之后再从下往上填入TC
依次这样做

curRows = 0 -> 1 -> 2

代码如下

package main
func convert(s string, numRows int) string {
    if numRows == 1{
        return s
    }
    length := len(s)
    Rows := func(a int,b int)int{
        if a > b{
            return b
        }else{
            return a
        }
    }(length,numRows)
    res := makeTwo(Rows)
    var curRow int
    var goingDown bool = false
    for _,char := range s{
        res[curRow] = append(res[curRow], string(char))
        if curRow == 0 || curRow == numRows - 1{
            goingDown = !goingDown
        }
        if goingDown{
            curRow += 1
        }else{
            curRow -= 1
        }
    }
    //res := makeTwo(math.Min(float64(length), float64(numRows)))
    var result string = ""
    for _,value := range res{
        for _,v := range value{
            result += v
        }
    }
    return  result
}
func makeTwo(length int) [][]string{
    res := make([][]string ,length)
    for i:=0;i<len(res);i++{
        res[i] = make([]string, 0)
    }
    return  res
}
func main(){
    convert("LEETCODEISHIRING", 3)
}

有几个地方比较难受,go虽然提供了min函数,但是只支持float64类型的,而且go的函数是不可以重载的(你说难受不难受

而且go似乎没有提供三元表达式,所以我们需要:

    Rows := func(a int,b int)int{
        if a > b{
            return b
        }else{
            return a
        }
    }(length,numRows)

还有生成二维的切片也是需要注意的

func makeTwo(length int) [][]string{
    res := make([][]string ,length)
    for i:=0;i<len(res);i++{
        res[i] = make([]string, 0)
    }
    return  res
}

程序的主逻辑

    for _,char := range s{
        res[curRow] = append(res[curRow], string(char))
        if curRow == 0 || curRow == numRows - 1{
            goingDown = !goingDown
        }
        if goingDown{
            curRow += 1
        }else{
            curRow -= 1
        }
    }

尤其注意:

        if curRow == 0 || curRow == numRows - 1{
            goingDown = !goingDown
        }

如果当前行为0,或者马上就要到下一行了

需要立即调整方向

当然我这样做肯定是很费时间的,可以看到速度比java实现的还慢了一点,但是内存占用是真的小

其实完全没必要用二维的切片,一维的即可

同时代码逻辑也可以优化

观赏一下代码:核心思路就是每两个一组

func convert(s string, numRows int) string {
        if numRows == 1 {
        return s
    }
    b := numRows - 1
    strArr := make([]string, numRows)
    for k, v := range s {
        if (k/b)%2 == 0 {
            strArr[k%b] += string(v)
        } else {
            strArr[b-(k%b)] += string(v)
        }
    }
    return strings.Join(strArr,"")
}

这种方法实现的只需要8ms


相关文章

  • LeetCode每日一题,Z字形变换

    题目 Z 字形变换[https://leetcode-cn.com/problems/zigzag-convers...

  • LeetCode z字形变换

    LeetCode z字形变换 发现规律,第一行和最后一行,以及中间的普通行分开按等差数列找规律。 第一行和最后一行...

  • Z字形变换-leetcode

    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I RE ...

  • Python算法-模拟过程实现算法

    6. Z 字形变换[https://leetcode-cn.com/problems/zigzag-convers...

  • LeetCode[6] - Z字形变换

    题目 将字符串 "PAYPALISHIRING"以Z字形排列成给定的行数: 之后从左往右,逐行读取字符:"PAHN...

  • [LeetCode]6、Z字形变换

    题目描述 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETC...

  • Leetcode 6 Z字形变换

    Z 字形变换 题目 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "...

  • leetcode 6 Z 字形变换

    这个题的关键在于控制到达行0或者行的最大值时往回走的问题,有点像个铁道兵,走到路的尽头就返回。 自己的解法,使用s...

  • LeetCode 6 Z字形变换

    6 Z字形变换 一、题目 将一个给定字符串根据给定的行数,以从上往下、从左到右进行Z字形排列。 比如输入字符串为"...

  • Leetcode 6 Z字形变换

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISH...

网友评论

      本文标题:Z字形变换-leetcode

      本文链接:https://www.haomeiwen.com/subject/dwxlfhtx.html