LeetCode Q6-Q10
Q6 Z字形变换 ZigZag Conversion
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
这道题目刚开始真是完全没看懂,感觉更像是倒N字形,看明白了之后发现确实按照字符的排序还是Z字形。但其实什么形状的并不是很重要,题目给出的排列是很偏图形化的,然而最后需要我们输出的却是一条字符串,所以可以暂时忽略掉这个图形化的问题。也正是看了这个图,我第一时间想到了用二维数组来写这道题,最后看了别的大佬的答案才有所悔悟,
从表面上看这道题是一个Z字形的排列,实际上它并没有在空间上实际形成Z字形,通过最后的结论来看,只是将字符串从上往下再从下往上如此反复的排列,再从横向取新字符串。
以下是我的理解:
- 先声明一个大小为
numRows
的字符串数组。这里犯了一个错,python中一维数组的声明需要用到类似[""]*numRows
的声明,不然会出现超出列表长度的问题。 - 根据循环,先是将原字符串
s
从sol[0]
到sol[numRows-1]
一直往下输入,直到sol[numRows-1]
,这时候将输入的方向颠倒。这里用到了一个增量inc
,本身为1,从0到numRows-1时逐一增加,直到numRows-1开始inc*=-1
使得逐一递减直到0,如此往复。 - 若第二步遍历完成了,直接让
sol[0]
到sol[numRows-1]
加到一个字符串就好了
整个代码里面最核心的就是python字符串相加的这个功能,可以很简洁地用+=
来实现。
class Solution:
def convert(self, s, numRows):
index=0
sol=[""]*numRows
#sol=[] #错误
inc=1
final=""
for i in range(len(s)):
sol[index]+=s[i]
if numRows>1:
index+=inc
if index== 0 or index==numRows-1:
inc*=-1
for j in range(numRows):
final+=sol[j]
return final
Q7 整数反转 Reverse Interger
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
难得看到自己马上做完了一道,果然还是道Easy难度题:
class Solution:
def reverse(self, x: int) -