Leetcode 6 ZigZag字符串

Time: 2019-08-01
语言:Python3
难度:中等

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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,则一个竖行都走不完的,这在定义数组大小时候需要注意。

如何定义已知大小的数组?

答案是用生成式来写。

rows = ['' for i in range(min(len(s), numRows))]

用一个变量goingDown来表示行走的方向,在遇到竖行的末尾时,掉头向上。用curRow跟踪当前处在哪一行,按照这个模式把所有的字符填到对应的行上即可。

代码

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s
        # 按行存储数据的对象
        rows = ['' for i in range(min(len(s), numRows))]
        curRow = 0
        goingDown = False
        
        for c in s:
            rows[curRow] += c
            if curRow == 0 or curRow == numRows - 1 :
                goingDown = not goingDown
            if goingDown:
                curRow += 1
            else:
                curRow -= 1
                
        # 取出结果
        res = ""
        for row in rows:
            res += row
        return res

理解了上面的思路,再看这个题的代码就很自然,也很简单了。

时间复杂度:O(n)
空间复杂度:O(n)

新的思路

算法题,除了掌握基本的算法写法外,不断优化算法的心理也很重要,不要满足于当前的算法复杂度,精益求精。

自己想不到的就去看别人的思路,一定要有这种习惯。

TBD...

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,392评论 0 2
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,435评论 0 5
  • 二维数组 所谓二维数组就是一个一维数组的每个元素又被声明为一 维数组,从而构成二维数组. 可以说二维数组是特殊的一...
    极客江南阅读 2,458评论 0 10
  • 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
    希崽家的小哲阅读 6,344评论 0 12
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,997评论 2 13