我刚开始学python,算法与数据结构实在也不咋地,基本都是暴力解题,想到什么就写什么,然后根据测试用例发现自己哪里逻辑不通,再修改,发帖只是为记录自己的思路,以及之后如何改进,不喜勿喷qaq。
题目描述:
代码:
class Solution:
def convert(self, s: str, numRows: int) -> str:
self.length = len(s)
self.start = 0
self.temp = 0
self.new_list = []
self.circle = (numRows-1)*2 #每行相邻竖轴字母差值
self.bianjie = 0
if numRows == 1: #如果行数为1,直接就是一行,返回s就行
return s
while self.start <numRows: #按层输出
self.temp = self.start #每层遍历
if self.temp ==0 or self.temp ==numRows-1: #如果是第一层或最后一层
while self.temp<self.length: #保证不超出列表上限
self.new_list.append(s[self.temp])
self.temp +=self.circle
else:
while self.temp<self.length:
if self.temp > numRows: #如果不是第一列的话
self.new_list.append(s[self.temp-self.start*2])#两相邻竖轴之间的字母
self.new_list.append(s[self.temp])
self.bianjie = self.temp+self.circle
if self.bianjie> (self.length-1) and (self.bianjie-self.start*2)<self.length:
self.new_list.append(s[self.bianjie-self.start*2]) #最后一个竖轴右边的同一行字母
self.bianjie = 0
self.temp +=self.circle
self.start +=1
self.str1 = list(map(str,self.new_list))
self.str2 = ''.join(self.str1)
return self.str2
思路:
大致是观察每一行相邻字母之间在位置上的关系,以行数为4时为例,第一行两个相邻字母之间差值是6,观察前两个例子,可以得知,在numRows>1时,同行竖轴字母间差值为(numRows-1)*2,除了第一行与最后一行,其余各行之间均有斜向字母,观察规律可得,每一个斜向字母,其位置为同行后一个竖向字母的位置减去行数*2,但是如果最后一个竖轴右侧有斜向字母,但是此时已经超过循环上限,所以另加边界来判断。
官方大神的代码:
class Solution:
def convert(self, s: str, numRows: int) -> str:
# 多行字符列表
matrix = [[] for _ in range(len(s))]
# diff == -1 表示 i 递减,diff == 1 表示 i 递增。
# 视为 i 即将从 1 减至 0,然后开始递增,这样代码好写。
i = 1
diff = -1
# 遍历更新 matrix
for char in s:
i += diff
if i == 0 or i == numRows - 1:
diff *= -1 # 变更递减或递增
matrix[i].append(char)
# 拼接
return ''.join(''.join(row) for row in matrix)
作者:Shawxing精讲算法
链接:https://leetcode.cn/problems/zigzag-conversion/solutions/2848410/zui-hou-pin-jie-huo-zhe-zhi-jie-ying-she-dark/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
反思:
不得不说,这差距真的好大,大神几行代码的事,遍历更新的方法是真的牛,+1,+1递进,到指定位置后开始-1,🐂,还有就是列表内部嵌套列表,使得嵌套的每个列表代表输出的一行。