leetcode题目之ZigZag

先让我哭会儿。。。

这道题让我自闭了,发现自己逻辑思维能力好差,因为我从看到这道题再到想这道题,然后再开始码代码,然后再运行、调试,真的心累,然后也不知道到底哪儿出了问题,但是,程序袁挺过来了,最后验证自己的逻辑是正确的,开心!(没见过世面的样子。。。)

看题如下:

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

给定一个字符串,这个字符串的长度大小目前没说,按照实例里面的是一个"PAYPALISHIRING"这样的字符串,然后按照“之”字形排列,最后按照行输出字符串

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string s, int numRows);

接口函数已经封装好了,我们需要在这个函数里面完成代码功能。

Example 1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

第一个例子,当n=3时,也就是这个“之”字形的列数为3,然后按照行输出出来

Example 2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

P     I    N
A   L S  I G
Y A   H R
P     I

第二个例子,当n=4时,“之”字形的列数为4,按照行输出。

应该比较容易理解,接下来说下我的思路:

首先,我得知道输入的字符串的长度,比如字符串'yuantianlishasha',这个长度我在拿到字符串参数的时候就要得到,接下来就是要根据输入的另一个参数numrows来分析数字序列:

当列为3时,输出的下标序列为:1232 1232 1232 ... 这样的规律...

当列为4时,输出的下标序列为:123432 123432 123432 ...

当列为5时,输出的下标序列为:12345432 12345432 12345432...

因此,在这儿就发现了规律了,所以接下来我要根据输入的列数来计算我的序列号,根据这个序列号就可以按照下标对应的字符输出了。

注意,还有个问题,比如列数很多,字符不够的情况下该怎么办?这个时候需要进行求余数,比如字符串'yuantian',n=6,字符串里面一共有8个字符,但是有6行,所以第一列占满了6个字符,最后两个分别是a 和 n,并没有占满,所以我们就需要利用公式去计算对于不同的字符串长度,对应不同的行数,需要得出的下标输出序列。

公式就是对应不同的n所输出的一整个序列,比如n=6时就是1234565432,乘以字符串除以这个长度的总数的取整,也就是用字符串长度去除以10(1234565432一共10个字符),然后再把余数,也就是最后不够整的那几个字符对应的下标序列求出来。

代码如下,凑合着看:

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        m = len(s)
        n = numRows
        li = li2 =  []
        for i in range(1, n):
            li.append(i)
        li.append(numRows)
        for i in range(0, len(li) - 2):
            li2.append(li[len(li) - 2] - i)
        li3 = li + li2
        p = len(li3)
        remain_total = m // p
        remain_left = m % p
        final = li3*remain_total + li3[0:remain_left]
        obj = []
        for i in range(1, n + 1):
            for j in range(len(final)):
                if i == final[j]:
                    obj.append(j)
        finallyStr = ''
        for i in obj:
           finallyStr += s[i]
        return finallyStr
if __name__ == '__main__':
    print(Solution().convert('yuantianlovelishasha',8))

其中部分运行结果如下,加了一些检查语句。

 最终提交结果如下:

 代码优化后面进行,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值