力扣题库刷题笔记6--N字型变换

1、题目如下:

2、个人Python代码实现:

        看到此题的第一反应就是,生成一个类似二维数组的多个字符串,然后用个标志位控制N字符中字符的方向,例如flag = True,在每次循环时候以flag = flag * -1来控制。

        由于示例中字符串s可能看的不是很确切,所以为了更好的理解,于是自定义了一个字符串

s = "ADINSXTOJEBFKPUYVQLGCHMRWZ",numRows = 6。这样其进行N字型变换后,会按照英文字母排序,接下来用Excel加深理解:

        以上图为例,原本的思路是根据numRows生成对应个数的字符串,“ABC”、“DEFGH”以此类推,最后将字符串求和,中间有个点是需要通过标志位控制字符方向。由于个人确实不擅长生成二维数组类似的操作,所以换个思路,采用循环的方式,也就是最初思路中生成的字符串个数,转换成循环次数即可。关于上图,做以下解释:

        a、表的行数代表了循环次数,循环次数的值也就是numRows,那么这里就会出现一个问题,每一次循环在字符串s中取多少个字符呢?取得字符个数可以理解为表里面有多少种颜色。

换种说法就是,外部循环次数为numRows,内部循环通过字符下标去判断循环次数,这里经过过观察,每一次内部循环次数其实是math.ceil(len(s) / 2* (nowRows - 1)),如果这里次数不理解,可以参照上表字符A到字符E是第一次循环,字符B到字符G代表第二次循环(如果有小伙伴表示这个循环的方式和表中的背景颜色不同,也可以理解成T-Y是第一次,V-Z是第二次)

        b、第一列加粗的不算是一次内部循环,这里可以理解成每一次内部循环开始前,需要去定位从哪个字符开始取,所以第一列就是用于定位的

        c、针对有背景色的数字做个解释,其中的数字代表的是他与他左侧的字符的距离。以第2行为例,字符是DEFGH,D是第2次内部循环开始前,从D开始取,而DE、EF、FG、GH之间的下标差分别是8282,所以在最后的表里面第2行的值 分别就是18282。

        d、继续观察,N字型转换的竖列之间下标差都是2 * (numRows - 1),参考下面两个图

 

       

        针对以上几个点,可以开始写代码了:

        代码如下:

class Solution:

    def convert(self, s: str, numRows: int) -> str:

        if numRows >= len(s) or numRows == 1:               #当numRows值大于等于字符串s长度时,直接返回字符串s

            out_put = s

        else:

            num1 = 0                        #num1用于记录外部循环次数

            num2 = math.ceil(len(s) / (2 * (numRows - 1)))    #num2用于判断内部循环次数,这里注意向上取整  

            num = 2 *(numRows - 1)          #num用于记录N字型竖列之间的下标差

            out_put = ''                    #用于输出

            while num1 < numRows:

                temp = s[num1]              #初始化每一次循环开始,从哪个下标开始取字符

                out_put += temp             #将初始化的字符加入out_put

                i = 1

                if num1 == 0 or num1 == (numRows - 1):   #当循环不是第一次或者最后一次时,每一次内部循环只取1个字符加入out_put

                    while i <= num2:                        

                        num4 = num1 + num * i

                        try:

                            out_put += s[num4]

                        except:

                            pass

                        i += 1

                    num1 += 1

                else:                                   

                    while i <= num2:

                        num4 = num1 + num * i

                        num3 = num4 - 2 * num1

                        try:

                            out_put += s[num3]

                            out_put += s[num4]

                        except:

                            pass

                        i += 1

                    num1 += 1

        return out_put

3、题解Python实现:

        这里只截个图,思路实际上是我最初的思路,但是我知道杂生成多个字符串,也写不到这么简洁,膜拜。

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值