先说简单的,反转整数。
这个在python通过类型转换非常好实现,注意一下有负号的情况即可。
接下来是字符串转整数。
这也非常简单,利用strip先把最前面的空格给去掉。
再一个个比对,如果遇到非数字就结束。
比较坑的点是它直接给你空字符串或者 "+" ,"-",所以还是比较烦的。
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
str = str.strip()
if not str[0].isdigit():
if str[0] != '-' and str[0] != '+':
return 0
res = str[0]
i = 1
while i < len(str):
if not str[i].isdigit():
break
res += str[i]
i += 1
ans = int(res)
if ans > 2**31 -1 :
ans = 2**31 - 1
elif ans < -(2**31):
ans = -2**31
return ans
比较有意思的是Z字形输出。
首先看到这个Z字形,因为它输出不需要带空格,所以你不要看空格,那只会影响你的思考。等于说把结果看成若干个行数相等(斜的部分不相同,把同一斜列看成同一竖列)的竖列并排排列的结果。
这样看就清晰很多,我们可以建立一个二维数组,inner list 代表每一行。思路为我们每次取一个字符然后向它应该在的行填进去。
那这个填充顺序也非常有规律,因为一开始是从上至下,接着从下至上,后来又从上至下。所以方向是不断在变的,我们需要一个方向常量,在某些特殊节点我们变换方向。于是问题就在于怎么找这个节点和你的结构控制了。
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows == 1:
return s
a = [[]for i in range(numRows)]
r = 0
direction = 1
for i in s:
a[r].append(i)
if r == numRows - 1:
direction = -1
elif r == 0:
direction = 1
r += direction
res = ""
for row in a:
for col in row:
res += col
return res
填充完了之后,我们只需把遍历每一行每一个然后返回即可。
所以这道题主要在于看你能不能找到Z字形运动的规律,以及看你用什么数据结构去储存数据。