• LeetCode 6.Z 字形变换


    题目:


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


    思路:

    一开始没看懂题目,看了评论才知道意思,这里列一下我认为比较容易理解的的方法。 主体思想是找到矩阵填入字符规律。

    方法一:

    第一种,是模拟Z型矩阵,造对应行数的二维数组存入字串,这个方法虽然不怎么聪明,但是更能直观的理解处理思想。

    class Solution(object):
        def convert(self, s, numRows):
            """
            :type s: str
            :type numRows: int
            :rtype: str
            """
            if numRows == 1 or len(s) <= numRows:
                return s
            Dict = self.getArray(s, numRows)
            rows = min(len(s), numRows)
            strList = []
            for line in range(rows):
                strList.extend(Dict[line])
            return ''.join(strList)
    
        def getArray(self, s, numRows):
            rows = min(len(s), numRows)
            Dict = {}
            for row in range(rows):
                Dict[row] = []
            curRow = 0
            flag = False
            for index in range(len(s)):
                Dict[curRow].extend(s[index])
                if curRow == 0 or curRow == numRows - 1:
                    flag = not flag
                curRow += 1 if flag else -1
            return Dict
    

    执行用时 :84 ms, 在所有 Python 提交中击败了30.31%的用户

    内存消耗 :12.7 MB, 在所有 Python 提交中击败了12.50%的用户

    方法二:

    前面是用二维数组存入对应字符,这个方法是按照行数numRows生成一个字符串数组rows_str_list,rows_str_list[0]即第一行的字符串,rows_str_list[1]即第二行字符串,以此类推,然后取出输入的字符串s的每个字符在这个数组上扫描添加,step表示扫描方向,扫描到index=0或者index==numRows就变换方向,依次把每个字符填入对应的行,最后字符串拼接一下。

    class Solution:
        def convert(self, s, numRows) :
            if numRows == 1 or len(s) <= numRows:
                return s
            row, step = 0, 1
            rows_str_list = ['' for _ in range(numRows)]
            for char in s:
                rows_str_list[row] += char
                if row == 0:
                    step = 1
                if row == numRows-1:
                    step = -1
                row += step
            return ''.join(rows_str_list)
    

    执行用时 :52 ms, 在所有 Python 提交中击败了78.46%的用户

    内存消耗 :12.8 MB, 在所有 Python 提交中击败了12.50%的用户

    方法三:

    前面分别用二维和一维数组存入字符,现在直接通过字符进行拼接,这个方法也比较巧妙,直接通过对塞入的字符index规律进行拼接。这个规律需要实际写一个Z型,标记index比较好理解该规律。

    class Solution(object):
        def convert(self, s, numRows):
            """
            :type s: str
            :type numRows: int
            :rtype: str
            """
            if numRows == 1 or len(s) <= numRows:
                return s
            res = ""
            for i in range(numRows):
                j = 0
                count = i
                tempCount = -1
                while count < len(s):
                    if tempCount != count:
                        res += s[count]
                    tempCount = count
                    if j % 2 == 0:
                        count += 2 * (numRows - (i + 1))       
                    else:  
                        count += 2 * i
                    j += 1
            return res
    

    执行用时 :68 ms, 在所有 Python 提交中击败了49.71%的用户

    内存消耗 :12.7 MB, 在所有 Python 提交中击败了12.50%的用户

  • 相关阅读:
    Linux下查看tomcat版本
    React跳转路由传参3种方法和区别
    pc端布局方案
    vue针对搜索引擎做SEO优化
    vue-cli3配置vue.config.js持续更新
    MySQL连接语法(多表查询)
    MySQL约束和外键约束
    MySQL数据库查询
    MySQL数据库入门
    jQuery用法和bootstrap框架
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/12935595.html
Copyright © 2020-2023  润新知