leetcode8:字符串转整数 (atoi)

实现 atoi,将字符串转为整数。

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

1.我的思路:

比较繁琐,首先确定第一个字符为"+","-",数字,然后找到第一个数字索引和第一个非数字索引。把其切片,然后转换成整数。代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 class Solution:
 4     def myAtoi(self, str):
 5         """
 6         :type str: str
 7         :rtype: int
 8         """
 9         i = 1
10         start = 0 #  有效数字的第一位索引
11         end = 0 #  有效数字的第二位索引
12         a = str.lstrip()
13         if a == "": #分三种情况,为空,首个字符为+,首个字符为-
14             return 0
15         elif a[0] == "-":
16             a = a[1:]
17             i = -1
18             if a =="" or (not a[0].isdigit()):
19                 return 0
20         elif a[0] == "+":
21             a = a[1:]
22             i = 1
23             if a =="" or (not a[0].isdigit()):
24                 return 0
25         elif a[0].isdigit():
26             pass
27         else:
28             return 0
29         for value in a:
30             if not value.isdigit():
31                 end = a.index(value)
32                 break
33         else:
34             end = len(a)
35         b = int(a[start:end])
36         c = b * i
37         if c > 2 ** 31 - 1:
38             return 2**31-1
39         elif c < -2 ** 31:
40             return -2**31
41         else:
42             return c
43 s = Solution()
44 print(s.myAtoi("-"))

2.网上的思路:

直接用了正则表达式。r'^[+-]?\d+'  ,这样整个步骤直接被简化了,果然刷题需要看别人的解答,

经过重新思考,又写了一遍:

 1 class Solution:
 2     def myAtoi(self, str):
 3         """
 4         :type str: str
 5         :rtype: int
 6         """
 7         import re
 8         reObj = re.compile(r'^[+-]?\d+')
 9         res = reObj.findall(str.strip(' '))
10         if res != []:
11             if int(res[0]) > 2**31-1:
12                 return (2**31-1)
13             elif int(res[0]) < -2**31:
14                 return (-2**31)
15             else:
16                 return int(res[0])
17         else:
18             return 0
19 s = Solution()
20 print(s.myAtoi("+876"))

猜你喜欢

转载自www.cnblogs.com/gaowanru/p/9258191.html