题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
代码实现
- 按行排序
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22class 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)
- 归纳统计
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class 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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复