• 题目描述

    Z字变换

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

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

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

    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

    示例 1:

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

    示例 2:

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

    1
    2
    3
    4
    L     D     R
    E O E I I
    E C I H N
    T S G
  • 说明

    Z字转化其实就是交替输出字符,如下图所示:

    Z字转化

  • 解答

    • Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # -*- coding:utf-8 -*-
    # @Time : 2020-08-29 13:29
    # @Author : 宋晓奎
    # @Email : austsxk@vip.qq.com
    # @File : item_07Zconvert.py
    # @Software : PyCharm


    class Resolution(object):
    def convert(self, s: str, row: int) -> str:
    """
    将字符串转化为z字
    :param s: 字符串
    :param row: 行数
    :return:
    """
    if row <= 1:
    return s
    begin, flg = 0, -1
    array = ['' for _ in range(len(s))]
    for c in s:
    array[begin] += c
    if begin == 0 or begin == row - 1:
    flg *= -1
    begin += flg
    return "".join(array)
    • Golang
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package main
    import "strings"
    /*
    @Time : 2020/8/28 13:48
    @Author : austsxk
    @Email : austsxk@163.com
    @File : day29_Zupdate.go
    @Software: GoLand
    */

    6. Z 字形变换
    func convert(s string, numRows int) string {
    if len(s) <= 1 {
    return s
    }
    // 初始化控制的索引和控制的标志
    begin, flag := 0, -1
    // 将每一行的字符进行拼接,然后最后将数组拼接
    array := make([]string, len(s))
    for _, value := range []rune(s) {
    array[begin] += string(value)
    if begin == 0 || begin == numRows -1 {
    // 如果是第一行和最后以后,在拼接完字符后,应该立马进行转化flag,反向操作
    flag *= -1
    }
    // 通过flag的改变控制下次拼接字符的索引,即行数
    begin += flag
    }
    // 将数据进行拼接后返回
    data := strings.Join(array, "")
    return data
    }