17 字符串转换整数(aoti)-20200328
题目
请你来实现一个 atoi
函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
示例
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
说明
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
注意事项
- 除了数字、正负号外,其余的字符都可以省去。
- 注意数字范围。
- 开头的非空字符只能是数字或者是正负号。
思路一
首先判断开头的是不是除数字或者是正负号外的其他字符,是就 return 0,不是继续。可以利用 string 的 isdigit() 判断是否是数字,同时判断是否是 “+” 或者是 “-”,并通过符号标识位体现出来。然后遇到合适的数字就n = n*10 + s[i]。最后通过符号标识位输出正负。
修改经历:
1.出现正数没法判断的情况。经检查第一个判读少了取反。。。(第一次提交)
- 解答错误
2. 出现开头为空格无法判断的情况,可以将判断修改为s!=' '。(第二次提交)
- 解答错误
3. 出现小数点需要取整。。。你也没说啊(第三次提交)
- 解答错误
4. 还是太年轻。。。+-2是什么鬼(第四次提交)
- 解答错误
5. 终于可以了。(第五次提交)
- 执行用时 :44 ms, 在所有 Python3 提交中击败了49.00%的用户
- 内存消耗 :13.6 MB, 在所有 Python3 提交中击败了5.24%的用户
心得体会:
最怕烦这种判断条件多的了。。。虽然性能一般,但是还是做出来了,还行吧
class Solution:
def myAtoi(self, str: str) -> int:
INT_MAX, INT_MIN = pow(2, 31)-1, -pow(2, 31)
num, idicater = 0, 0
for s in str:
if s == '.':
break
else:
pass
if idicater == 0 and s not in ['+', '-'] and not s.isdigit() and s!=' ':
return 0
else:
if idicater == 0 and (s in ['+', '-'] or s.isdigit()):
if s.isdigit():
idicater = 1
num = num*10 + int(s)
elif s == '+':
idicater = 1
else:
idicater = -1
elif idicater != 0 and s.isdigit():
num = num*10 + int(s)
elif idicater != 0 and not s.isdigit():
break
else:
pass
if INT_MIN<=num*idicater<=INT_MAX:
return num*idicater
elif num*idicater>INT_MAX:
return INT_MAX
else:
return INT_MIN
思路二
人比人是要气死人的。。。大神一句正则表达,让我觉得自己的这么多if...elif...else就像个傻子一样。。。主要用到的正则表达式还有解包的知识,这部分放在Python 3 知识点复习里了。
最终代码展示:
import re
class Solution:
def myAtoi(self, str: str) -> int:
INT_MAX = 2147483647
INT_MIN = -2147483648
str = str.lstrip() #清除左边多余的空格
num_re = re.compile(r'^[\+\-]?\d+') #设置正则规则
num = num_re.findall(str) #查找匹配的内容
num = int(*num) #由于返回的是个列表,解包并且转换成整数
return max(min(num,INT_MAX),INT_MIN) #返回值