先让我哭会儿。。。
这道题让我自闭了,发现自己逻辑思维能力好差,因为我从看到这道题再到想这道题,然后再开始码代码,然后再运行、调试,真的心累,然后也不知道到底哪儿出了问题,但是,程序袁挺过来了,最后验证自己的逻辑是正确的,开心!(没见过世面的样子。。。)
看题如下:
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))
其中部分运行结果如下,加了一些检查语句。
最终提交结果如下:
代码优化后面进行,谢谢!