先说简单的,反转整数。
这个在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字形运动的规律,以及看你用什么数据结构去储存数据。