(Python)LeetCode 6:Z字形变换

题目:

这道题目依然考察的是Python中字符串的使用,包括字符串的下标,在题目所给的条件中找到规律。

思路:

如果真的按照像题目说的这样,先变为一个Z字形(其实更像N),然后一行一行输出其实是很麻烦的,首先我们不知道要输出什么字母,再加上中间这些空格,最后再整合为一个字符串,非常麻烦。

而这类题目实际上就像小学的找规律,一定是有规律可言的,无非就是下标的变换操作,只要找到下标的变化规律就可以很好的解决。就像以前学的输出一个等腰或者直角三角形之类的形状,无非也是下标的变化。

于是,,就开始找规律了,首先观察题目,nunRows代表这个Z字形总共会有多少行,我寻思着应该是每一行之间有一些规律,所以最后我画了个这样的图。。。(字有点丑,,请忽视)

从这里可以看出,第一行和最后一行的值是一样的,中间的行实际上变化值相加是等于第一行或是最后一行,且变化的差值是2,,于是开始想,到底是啥规律,最后得出结论,第一行的值实际上就是 2*numRows-2,然后下一行就是 一个在该基础上减2,另一个从0开始逐渐加2,直到第一个数减到2,再下一行就是最后一行,其实就相当于,第二个数增加到了2*numRows-2,于是在代码中我用 i 和 j 这两个变量分别表示中间行的第一个和第二个相加的数,那么第一行相当于是 j=0 ,最后一行相当于是 i=0 ,最后代码如下(代码不细说了,因为我代码比较弱,写的感觉还需要改进,所以思想get到了就可以了)

代码:

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        newString = ''
        length = len(s) # 记录原字符串长度
        gap = 2*numRows-2   # 第一行的下标差值
        if len(s)<=numRows or gap==0:  # 两种特殊情况
            return s
        for k in range(numRows):
            i = gap-2*k 
            j = 2*k 
            if j <= 0:     # Z字形的第一行
                p = k
                while p < length:
                    newString += s[p]
                    p = p + i
            if i > 0 and j > 0:    # Z字形的中间行(除了最后一行)
                p = k
                newString = newString + s[p]
                while p < length:  这一段的判断可以继续改进
                    p = p + i
                    if p >= length:
                        break
                    newString += s[p]
                    p = p + j
                    if p >= length:
                        break
                    newString += s[p]
            if i <= 0:     # Z字形的最后一行
                p = k
                while p < length:
                    newString += s[p]
                    p = p + j
        return newString

另:在前两次提交的时候 忽略了两种情况
1. 一种是当numRow为1时,根本不需要进入for循环,这个可以根据gap = 20-2 =0,即gap ==0 的条件来判断

"AB"

1

2. 另外一种是,实际上字符串的长度小于所给的numRows的大小,这个时候实际上经过z字形处理的这个字符串就是原本的字符串,所以还是直接返回原字符串即可,这个可以根据条件
len(s)<numRows来进行判断

"A"

3

所添加的这两种情况的判断就在整个代码的第一个 if 那 #两种特殊情况

执行情况:

 

在时间和内存的开销方面还需要改进,尤其是内存开销这方面,还是得看看大佬们怎么解的。

关于解题方法欢迎大家一起讨论~

Guess you like

Origin blog.csdn.net/weixin_44260459/article/details/121275314