美文网首页
LeetCode_Python(6)_Z 字形变换

LeetCode_Python(6)_Z 字形变换

作者: 惑也 | 来源:发表于2019-01-23 01:24 被阅读13次

需求

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

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

示例 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

方法一

  1. 解题的过程也是总结规律的过程,找到规律则代码更优雅,更容易理解,如果完全按需求一步一步实现,通常效率会差一点,或者代码不易理解;

  2. 本题是按N字形排列,以3行为例,遍历字符串时,得到的字符对应的行号为12321232123·······,构造这样的序列,遍历时添加到不同的行中即可;

  3. 创建一个空列表,包含n个子空列表,n为行数,对应不同行的字符;

  4. 构建规律中的序列,遍历字符串将字符添加到对应的行中,通过列表推导式合并列表即可。

  5. 参考代码

def convert(s, numRows):

    # create null list
    mid = []
    n = 0
    while n < numRows:
        mid.append([])
        n += 1

    # create sequence
    tmp = []
    while len(tmp) <= len(s):
        for i in range(numRows): tmp.append(i)
        for j in range(numRows - 2, 0, -1): tmp.append(j)
    tmp = tmp[:len(s)]
    
    # get str
    for k, v in enumerate(s):
        mid[tmp[k]].append(v)

    return ''.join(''.join(x) for x in mid)

r = 3
s = 'LEETCODEISHIRING'
print(convert(s, r))
LCIRETOESIIGEDHN


方法二

  1. 创建一个空列表,包含n个子空列表,n为行数,对应不同行字符;

  2. 遍历字符串,将字符添加到空列中对应行数的子空列表中;

  3. 由于按N字形排列,遇到首行和尾行时,需要改变添加的方向;

  4. 通过列表推导式将结果列表转换成需要的字符串。

参考代码

def get_z_str(s, numRows):

    # no need to convert
    if numRows == 1:
        return s 

    # create null list
    mid = []
    i = 0
    while i < numRows:
        mid.append([])
        i += 1

    j = 0
    for k in s:
        mid[j].append(k)
        if j == 0:
            # direction change
            reverse = False
        if j < numRows - 1:
            if reverse:
                j -= 1
            else:
                j += 1
        else:
            j -= 1
            # direction change
            reverse = True
            
    return ''.join(''.join(x) for x in mid)

r = 3
s = 'LEETCODEISHIRING'
print(convert(s, r))
LCIRETOESIIGEDHN

相关文章

  • LeetCode_Python(6)_Z 字形变换

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

  • 6、Z 字形变换

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

  • LeetCode解题记录(6~10)

    6.Z字形变换 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: PAH NAPLSI...

  • LeetCode-6 Z字形变换

    题目:6. Z字形变换 难度:中等 分类:字符串 解决方案:字符串遍历 今天我们学习第6题Z字形变换,这是一个字符...

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

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

  • 6.Z字形变换

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

  • LeetCode[6] - Z字形变换

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

  • 6.Z字形变换

    将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: PA H NA P L SI I...

  • 6Z字形变换

    题目 思路1.文字转换有固定规则2.在长度内有序取数代码

  • 6.Z字形变换

    题目将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H NA P L ...

网友评论

      本文标题:LeetCode_Python(6)_Z 字形变换

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