题目:
这道题目依然考察的是Python中字符串的使用,包括字符串的下标,在题目所给的条件中找到规律。
思路:
如果真的按照像题目说的这样,先变为一个Z字形(其实更像N),然后一行一行输出其实是很麻烦的,首先我们不知道要输出什么字母,再加上中间这些空格,最后再整合为一个字符串,非常麻烦。
而这类题目实际上就像小学的找规律,一定是有规律可言的,无非就是下标的变换操作,只要找到下标的变化规律就可以很好的解决。就像以前学的输出一个等腰或者直角三角形之类的形状,无非也是下标的变化。
于是,,就开始找规律了,首先观察题目,nunRows代表这个Z字形总共会有多少行,我寻思着应该是每一行之间有一些规律,所以最后我画了个这样的图。。。(字有点丑,,请忽视)
从这里可以看出,第一行和最后一行的值是一样的,中间的行实际上变化值相加是等于第一行或是最后一行,且变化的差值是2,,于是开始想,到底是啥规律,最后得出结论,第一行的值实际上就是 ,然后下一行就是 一个在该基础上减2,另一个从0开始逐渐加2,直到第一个数减到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 那 #两种特殊情况
执行情况:
在时间和内存的开销方面还需要改进,尤其是内存开销这方面,还是得看看大佬们怎么解的。
关于解题方法欢迎大家一起讨论~