这道题是将字符串转为数字,其实是提取字符串中的数字,看起来很简单,但是有很多隐藏的条件:
- 有数字但是这个数字必须在整个串的开始。
- 有数字,但是其中夹杂字母。只考虑字母等符号前面的数字,后面的数字要忽略。
- 需要考虑 + - 符号 和前几位是0的情况。
- 考虑输入为空或者输入中并没有数字的情况。
- 考虑上下界问题。
- 输入的数字是整数还是浮点数
解决思路:
因为是要在字符串中提取需要的对象,涉及到判断对象是否满足要求存在,所以主要是使用的正则表达式来进行判断。根据本题目给出的要求,正则表达式写为:[-+]?[0-9]+,即可能含有正负号的数字。如果没有匹配的结果就退出。
如果匹配到相应的结果,就需要将结果提取出来进行处理。例如,如果输入的‘-123dd123’,匹配到的结果是-123,所以不能将整个串用来做最终的处理对象。提取正则表达式匹配结果:result.group()。
字符串和数字类型的类型的转换直接用int()或者float()来实现,他们会直接忽略前面的是0的情况,也就是-00123他们会直接处理为-123。
用正则表达式还是可以规避很多在串匹配时可能存在的问题的,而且运行效率也很客观。
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
INT_MAX = (2 ** 31) - 1 #首先定义上下界限
INT_MIN = -(2 ** 31)
import re
sp_result = str.split() #切割输入,用空格作为分割符号
if len(sp_result) == 0 #如果输入的空
#如果输入的值是空的
return 0
else:
result = re.match(r'[-+]?[0-9]+', sp_result[0]) #使用正则表达式的方法来进行匹配
if result == None:#没有可以匹配的结果
return 0
else:
if result.group().find('.') == -1: #判断是不是整数
res = int(result.group())
else:
res = float(result.group())
if res > INT_MAX:
return INT_MAX
elif res < INT_MIN:
return INT_MIN
else:
return res
#if __name__ == '__main__':
# print(Solution().myAtoi('+0023'))