算法解读-Z字形变换(Go)


问题描述

LeetCode#6

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

解题

解题思路

设置numRows个数组(以下程序中用切片实现),根据规律,依次将元素放入数组中,最后合并各个数组。

源程序(Go)

//Convert Z字型变换
func Convert(s string, numRows int) string {
    if utf8.RuneCountInString(s) <= 1 || numRows == 1 {
        return s
    }
    list := make([][]byte, numRows) //不能是: var list [numRows][]byte
    var result []byte
    index := 0
    flag := 1
    for i := 0; i < utf8.RuneCountInString(s); i++ {
        list[index] = append(list[index], s[i])
        if flag == 1 {
            index++
        } else {
            index--
        }
        if index == 0 || index == numRows-1 {
            flag = -flag //flag标签实现方向反转,放入数组
        }
    }
    for i := 0; i < numRows; i++ {
        for j := 0; j < utf8.RuneCount(list[i]); j++ {
            result = append(result, list[i][j])
        }
    }
    return string(result)
}

解读

  1. Go中多维切片实现

    list := make([][]byte, numRows)

    错误用法:

    var list [numRows][]byte

    如果这样写会报错,动态值不能直接放在括号中定义数组或则切片,而应该使用make进行定义

    这是golang 数组初始化的一个坑

    例如:

    //Length 是动态的值
    var array [length]int

    报错:non-constant array bound length

    动态数组应该这样写

    array := make([]int, length)

文章作者: Arjun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Arjun !
评论
 上一篇
VirtualBox 安装配置 VirtualBox 安装配置
VirtualBox虚拟机与Linux系统的安装配置(以安装一个名为Hadoop的Ubuntu-Linux为例) VirtualBox虚拟机下载安装下载下载地址 选择对应的版本下载 安装 配置 1.设置存储文件夹:管理-全局设定-常规-默认
2020-03-02
下一篇 
Golang-了解rune数据类型 Golang-了解rune数据类型
Golang中rune数据类型是什么?官方解释// rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by conventio
2020-02-24
  目录