问题描述:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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