题目
解法1. 数学规律法
class Solution:
def convert(self, s: str, numRows: int) -> str:
# if len(s)<2 or numRows<2: return s
# step=(numRows-1)*2
# res=""
# for i in range(numRows):
# add=i*2
# index=i
# while(index<len(s)):
# res+=s[index]
# if i ==0 or i== numRows-1:
# add=step
# else:
# add=step-add
# index=index+add
# return res
核心思想:
1.第一行和第二行步长为:step=(numRows-1)*2
2.中间行步长依次按照:step-i*2, i*2 变换
3.特例判断,当len(s)==1 or rownums==1时,返回s
解法2. hashmap法
if numRows==1:
return s
hashrow=["" for _ in range(numRows)]
k=0
flag=1
for c in s:
if k==0:
flag=1
if k==numRows-1:
flag=-1
hashrow[k]+=c
k+=flag
return "".join(hashrow)
HashMap核心思想:
1. hashmap未必是字典,这里使用了一个列表做hashmap,键为行号,值为字符(串)。
2. 首先使用"" 空字符串建立一个hashmap
3. 按照Z字形索引规律,遍历一遍字符串,把字符串按照Z字形的索引放入hashmap的对应行中。
4. Z字形索引规律:首行向下索引+1,到达尾行索引变为-1,再次向上。
1. 比较直观,但是step变换那里比较精妙。
2. 比较精巧,关键是要会用hashmap与行变换结合。