leetcode -- 6.Z 字形变换

问题描述:

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

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

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

解题要点:找出规律

 1 class Solution(object):
 2     def convert(self, s, numRows):
 3         """
 4         :type s: str
 5         :type numRows: int
 6         :rtype: str
 7         """
 8         #‘之’字形,4行时从p到l为6个字符,刚好就是a的值(找出的规律)
 9         a = numRows*2 - 2
10         #行数为键,字符为值存入字典dic
11         dic = {}
12         f = []
13         
14         #当行数为1,或者大于字符串的长度时,结果为s
15         if numRows == 1 or numRows >= len(s):
16             return s
17         
18         #遍历字符串
19         for i in range(len(s)):
20             #b为i整除a的余数
21             b = i % a
22             #b小于行数时按正常的顺序
23             if b < numRows:
24                 dic.setdefault(b, [ ]).append(s[i])
25             #上边这行代码的意思是若字典中有这一个key的话就直接append字符
26             #没有的话则新建该key,并vale为一个[ ]
27             #大于行数时按规律求得其所属的行数
28             else:
29                 d = a - b
30                 dic.setdefault(d, [ ]).append(s[i])
31         #将字典按key把其对应的vale加在一起整合成一个列表
32         for i in range(numRows):
33             f += dic[i]
34         #将列表里的元素转换成字符串
35         g = ''.join(f)
36         return g

 

posted @ 2019-02-23 20:59  夜雨声入眠  阅读(139)  评论(0编辑  收藏  举报