LeetCode(6)-Python-Z 字形变换(zigzag-conversion)

该博客讨论了LeetCode中的Z字形变换问题,提供了两种Python解决方案。第一种方法利用字典确定字符的行号,第二种方法通过块填充并进行上下排列实现。文章附带详细的解释和示例。
摘要由CSDN通过智能技术生成
题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。(我个人觉得这个更加比较像倒N)
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

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

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

示例

输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释如下:

L     D     R
E   O E   I I
E C   I H   N
T     S     G
解决思路

观察上面的例子,我们发现最后的输出是第一行的字母加上第二行的字母,一直加到最后一行的字母。那我们就考虑是不是可以建立numRows个临时空字符串,我们只要将字符串s中的每个字符,正确的插入到所在行对应的临时字符串的中,最后将这numRows个临时字符串拼接返回就可以了。

比如以上面那个示例为例,numRows=4,应该建立4个临时空字符串,L是第一个字符,则应该加入到第一个临时字符串中,E是第二个字符,应该加入到第二个临时字符串中,…,C是第五个字符,应该加入到第三个临时字符串中,…,一直到最后一个字符G加入到了第四个临时字符串中,最终将这四个临时字符串拼接到一起,则为我们需要的输出结果。

那我们问题的关键就变成了,如何确定字符串s中的每个字符所对应的行数,也就是说字符串s中的字符应该加入到第几个临时字符串中。

我们观察上面的两个示例,我们看看能不能发现如何确定字符对应行数的方法。

在这里插入图片描述在这里插入图片描述
如上图所示,我们可以发现,进行Z字排列的时候,我们总是先向下排列numRows个字符,再从左向右从下到上排列numRows-2个字符,接下来,循环往复,直到我们最终完成所有字符的排列。则我们可以把排列的过程看成一个一个块的堆叠,即先排满前一个块之后才能排列下一个块,那么我们就可以很容易的找出每个字符所对应的行数。

思路1

根据我们上面的分析,我们排列字符串s中的字符的时候,是一个块一个块的进行排列,那我们可以得到,当一个块填满的时候,其容量为2*numRows-2。后面块中字符与第一个块对应位置的字符相差n个(2*numRows-2)的大小,那我们可以设置一个字典,确定第一个块中字符所在的行数,则后面所有的块的内容,可以通过减去n*(2*numRows-2)来映射到我们的字典中,获得其所在的行数。

我们可以写出完成的代码为:

class Solution</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值