力扣第六题“Z字形变换”(python解决)

  我刚开始学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,🐂,还有就是列表内部嵌套列表,使得嵌套的每个列表代表输出的一行。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值