LeetCode Everyday:坚持价值投资,做时间的朋友!!!
题目:
将一个给定字符串根据给定的行数,以从上往下、从左往右进行Z字形排列。比如输入字符串为"LEETCODEEISHIRING"行数为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
代码
方法一: 利用字符串行索引的循环关系求解,下面是同一个方法的不同实现方式。题注
执行用时 :88 ms, 在所有 Python3 提交中击败了35.36%的用户
内存消耗 :13.7 MB, 在所有 Python3 提交中击败了5.00%的用户
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows < 2: return s
res = ["" for _ in range(numRows)]
i, flag = 0, -1
for c in s:
res[i] += c
if i == 0 or i == numRows - 1: flag = -flag
i += flag
return "".join(res)
"""
For Example: input: s = "LEETCODEISHIRING" numRows = 3
output: "LCIRETOESIIGEDHN"
"""
s = "LEETCODEISHIRING"
numRows = 3
solution = Solution()
result = solution.convert(s, numRows)
print('输出为:', result) # LCIRETOESIIGEDHN
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
cache = [i for i in range(numRows)] + [i for i in range(1, numRows-1)][::-1]
res = [""] * numRows
for i, c in enumerate(s):
res[cache[i%len(cache)]] += c
return "".join(res)
"""
For Example: input: s = "LEETCODEISHIRING" numRows = 3
output: "LCIRETOESIIGEDHN"
"""
s = "LEETCODEISHIRING"
numRows = 3
solution = Solution()
result = solution.convert(s, numRows)
print('输出为:', result) # LCIRETOESIIGEDHN
图解:
引用的图片有利于帮助你找到字符串行索引的循环关系
参考
- https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/
- https://www.bilibili.com/video/BV1n7411S7Vo