LeetCode6.python实现:Z 字形变换问题☆☆

目录

问题

解题思路

python具体实现

题外记


问题

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

解题思路

    分析:这是一个很有意思的题目,仔细分析问题,其实是一道找规律题。找到了规律,具体实现,问题就不大了。下面我们看常规情况的规律(指定行数n>=2)(特殊情况看详细步骤的说明):

    1)一个统一的规律(第一行和最后一行除外):每行的下标差值的变化规律,只有两个数字在交叉进行,我们规定:当前行数为i,则第一个数字=2(n-i),第二个数字=2(i-1);

    2)第一行和最后一行规律:这两行的规律一致,两个数字均为 2(n-1)(为了后续程序统一处理,所以也规定为两个数字。

规律的简单实例可参考下图和上述两条规律结合查看(比较乱):

    因此,详细步骤文字描述如下:

    1)特殊情况的处理:即指定行数n的值,若给定行数n值小于2,则直接返回给定字符串(包含了行数为0或是负数的情况)

    2)常规情况的处理:根据分析,首先我们要先将规律情况,用一个嵌套列表来存储,方便后续字符的直接读取拼接;然后我们就可以根据存储的规律值,外层按行遍历(这里注意遍历的控制为:min(numRows,len(s)),读取每行存储给定字符串的哪些字符了;里层的遍历,用while来实现,因为每行的两个规律数值是交替出现的,因此需要设置一个变量来控制交替进行,即程序中的jiouCount变量,然后交替改变变量值即可,参看程序的交替实现过程;

    3)遍历结束,返回结果值即可。

根据上述解题分析,代码如下:


python具体实现

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        
        if numRows<=1:          #若给定行数小于2,则直接返回给定字符串(包含了行数为0或是负数的情况)
            return s
        
        zRule = []              # 存储每一行的字母读取变化规律
        for i in range(numRows):
            if i ==0:           # 第一行的特殊处理
                zRule.append([2*(numRows-1),2*(numRows-1)])
            elif i == numRows-1:
                zRule.append([2*(numRows-1),2*(numRows-1)])
            else:
                zRule.append([2*(numRows-i-1),2*(i-0)]) # 最后一行的特殊处理
        
        zShapeStr = ''                    # 存储结果值,默认空字符串
        sLen = len(s)                     # 给定字符串的长度
        for i in range(min(numRows,sLen)):# 注意第一层循环的次数控制:min(numRows,sLen)
            zShapeStr = zShapeStr + s[i] 
            
            jiouCount = 0                 # 对zRule中的列表值的下标0,1进行控制读取 
            j = i+zRule[i][0]             # 默认准备读取的下一个字符的下标位置
            while j<sLen:
                zShapeStr = zShapeStr+s[j]
                if jiouCount ==0:         # 下一个字符的位置变化 
                    j = j+zRule[i][1]
                    jiouCount = 1
                else:
                    j = j+zRule[i][0]
                    jiouCount = 0
                
        return zShapeStr

题外记

       这题第一眼看的时候,给人感觉不难但又无从下手的感觉,找准规律,是解题的关键。程序实现,从某种层面上说,是另一回事。

大概就是所谓的眼高手低吧!

       需要注意的一点就是,行数遍历的控制:min(numRows,len(s).第一次提交失败,就栽在了这里!!!

       突然发现这也是一种简单的加密方式哟。

猜你喜欢

转载自blog.csdn.net/weixin_42521211/article/details/88101496