【LeetCode】6. Z 字形变换
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
1 <= s.length <= 1000
s
由英文字母(小写和大写)、','
和'.'
组成1 <= numRows <= 1000
二、思路分析:
我们读取题意,该题要求对一串字符串进行Z字形排序并输出。同样我们也需要对题目细节进行明确:
- 题目会给出字符串
s
和行数numRows
- Z 字形排序的特点:从上到下 + 45度斜上,依次重复
根据我们做过的498. 对角线遍历思路有异曲同工之妙。因此,解答该题我们仍然需要通过示例来推理一番如题目中栗子2:
通过案例推理,我们发现了Z字形遍历与行数的关系:
- 每一个周期次数是两倍行数减二即 t = 2*numRows-2
- 每个周期第一个字符索引位置r+i,[i范围0,len(s)-r]
- 每个周期第二个字符索引位置r + i -1
因此,根据上述我们找到的规律,直接使用模拟构建的方法,如下是Python实现的代码:
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
n = len(s)
ans = []
t = 2*numRows-2
if n <= numRows or numRows == 1 : return s
for r in range(numRows):
for i in range(0, n - r, t):
ans.append(s[i+r])
if 0 < r < numRows-1 and i+t-r < n :
ans.append(s[i+t-r])
return "".join(ans)
三、总结:
本题仍然考察我们对行和列之间关系,找到关系之后通过模拟方法就能轻松实现,AC提交记录如下:
- 时间复杂度:O(n),其中 n 为字符串 s 的长度
- 空间复杂度:O(1)
以上本期内容,欢迎大佬们点赞评论,下期见~~~
转载自:https://juejin.cn/post/7109464477254287396