【leetcode刷题】20T5-Z 字形变换

  • 2020 年 2 月 16 日
  • 笔记

木又同学2020年第5篇解题报告

leetcode第6题:Z 字形变换

https://leetcode-cn.com/problems/zigzag-conversion


【题目】

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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等于1或者大于len(s)时,返回原字符串即可。

其他情况,使用numRows个数组,依次存储对应的字符,最后将所有数组拼接在一起。

【代码】

python版本

class Solution(object):      def convert(self, s, numRows):          """          :type s: str          :type numRows: int          :rtype: str          """          # 特殊情况          if numRows == 1 or numRows >= len(s):              return s            res = [[] for i in range(numRows)]          ascend = True          index = 0          for i, si in enumerate(s):              res[index].append(si)              # 到达0或者len(res)-1,考虑换方向,除了第一次              if i != 0 and (index == 0 or index == len(res) - 1):                  ascend = not ascend              if ascend:                  index += 1              else:                  index -= 1          return ''.join(''.join(ri) for ri in res)