zoukankan      html  css  js  c++  java
  • 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%的用户

  • 相关阅读:
    JS文本框下拉提示效果
    JS动态添加删除表格行
    JS验证 数字 电话号码 传真 邮箱 手机号码 邮编 日期
    TreeView 中CheckBox级联选中问题
    HashTable Dictionary
    JS操作Frame对象
    Winfrom 中怎样在回车时设置焦点
    Word 操作(未完待续)
    HTML5特性——prefetching预加载功能
    10个实用的 jQuery Mobile 插件推荐
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/12935595.html
Copyright © 2011-2022 走看看