您的位置:首页 > 编程语言 > Python开发

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

2019-03-04 10:17 330 查看

目录

问题

解题思路

python具体实现

题外记

问题

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 

"LEETCODEISHIRING"
 行数为 3 时,排列如下:

[code]L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:

"LCIRETOESIIGEDHN"

请你实现这个将字符串进行指定行数变换的函数:

[code]string convert(string s, int numRows);

示例 1:

[code]输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例 2:

[code]输入: 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具体实现

[code]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).第一次提交失败,就栽在了这里!!!

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: