概述
题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
LeetCode原题地址:https://leetcode-cn.com/problems/zigzag-conversion/
测试用例
比如输入字符串为"LEETCODEISHIRING"
行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:
“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
- 示例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
代码实现
- 按行排序
class Solution(object):
def convert(self,s,numRows):
if numRows < 2:
return s
#用来存放Z字变换的字符串
list_rows = ["" for _ in range(min(len(s),numRows))]
#用来记录方向
is_down = False
#用来记录当前字符更新的行
current_row = 0
for s_c in s:
#更新存放变换后的列表
list_rows[current_row] += s_c
if current_row == 0:
is_down = True
elif current_row == numRows - 1:
is_down = False
#计算下一次更新变换列表的位置
current_row += 1 if is_down else -1
#返回最后变换后的字符串
return "".join(list_rows)
- 归纳统计
class Solution(object):
"""
L D R
E O E I I
E C I H N
T S G
归纳总结,统计出变换后的每行字符串在原字符串的位置
其中k代表的是某一行的字符个数,rows代表总的行数
原字符串满足第一行的公式:k(rows-1)*2
原字符串满足中间行的公式:k(rows-1)*2 + i和(k+1)(rows-1)*2 - i
原字符串满足最后一行的公式:k(rows-1)*2 + rows - 1
注:其实第一行和最后一行的公式都可以统一为,k(rows-1)*2 + i
"""
def convert(self,s,numRows):
if numRows < 2:
return s
s_size = len(s)
#每个循环的长度
cycle_len = (numRows - 1) * 2
#用来记录拼接后的字符串
ret = ""
#遍历每行
for i in range(numRows):
for j in range(0,s_size-i,cycle_len):
ret += s[j+i]
#如果是中间行的时候,会多一种情况
if i != 0 and i != numRows - 1 and j + cycle_len - i < s_size:
ret += s[j + cycle_len - i]
return ret
参考:
- LeetCode详细题解
最后
以上就是苹果缘分为你收集整理的Python实现字符串的Z 字形变换的全部内容,希望文章能够帮你解决Python实现字符串的Z 字形变换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复