题目:字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:
假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,qing返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: “42”
输出: 42
初步尝试:
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 删除空值
str = str.strip()
return int(str)
s = Solution()
print(s.myAtoi('-42'))
遇到输入为: "4193 with words"
,直接歇菜。需要删除除了数字之外的字符串以及添加超过范围的处理。
修改后有:
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 删除空值
str = str.strip()
# 删除非数字字符
str_new = ''
fuhao = ''
for i in str:
if i in '-+':
fuhao = i
elif '9'>=i>='0':
str_new +=i
else:
break
if str_new == '':
return 0
else:
str = fuhao + str_new
# 超过范围值修改
if int(str)>2**31-1:
return 2**31-1
elif int(str)<-2**31:
return -2**31
else:
return int(str)
s = Solution()
print(s.myAtoi("4193 with words"))
遇到 "+-2"
还是歇菜,这里按照题目要求应该处理为0
,但是我的代码运行为-2
。
继续修改:
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 删除空值
str = str.strip()
# 删除非数字字符
str_new = ''
fuhao = ''
for i in str:
# 提防符号报错问题
if i in '-+':
fuhao += i
elif '9'>=i>='0':
str_new +=i
else:
break
if len(fuhao) > 1:
return 0
if str_new == '':
return 0
else:
str = fuhao + str_new
# 超过范围值修改
if int(str)>2**31-1:
return 2**31-1
elif int(str)<-2**31:
return -2**31
else:
return int(str)
s = Solution()
print(s.myAtoi("+-2"))
遇到了"0-1"
还是不行啊!
继续修改: 这次修改了一开始正负号的问题。
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 删除空值
str = str.strip()
# 删除非数字字符
str_new = ''
fuhao = ''
if str[0] in '-+':
fuhao = str[0]
for i in str:
if i in '0123456789':
str_new +=i
else:
break
if str_new == '':
return 0
else:
str = fuhao + str_new
# 超过范围值修改
if int(str)>2**31-1:
return 2**31-1
elif int(str)<-2**31:
return -2**31
else:
return int(str)
然而,当输入为""
的时候,又报错了。想来一开始也没有考虑为空值做点什么。
后来连续的报错实在是很难受,干脆全部重写。
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 删除空值
str = str.strip()
str_new = ''
fuhao = ''
for i in str:
if i in '0123456789-+':
str_new +=i
# 解决空值问题
if len(str_new) == 0:
return 0
if len(str_new) == 1:
if str_new not in '0123456789':
return 0
# 解决多符号问题
for i in str_new:
if i in "-+":
fuhao += i
if len(fuhao)>1:
return 0
if not fuhao == '' and not fuhao == str[0]:
return 0
# 解决超出范围的问题
if int(str_new)>2**31-1:
return 2**31-1
elif int(str_new)<-2**31:
return -2**31
else:
return int(str_new)
"words and 987"
还是报错,这个的预期结果居然是0
好气哦!
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 删除空值
str = str.strip()
str_new = ''
fuhao = ''
if len(str) == 0:
return 0
if not str[0] in '0123456789-+':
return 0
# 删除尾部非数字字符
for i in str:
if i in '0123456789-+.':
str_new +=i
# 解决空值问题
if len(str_new) == 0:
return 0
if len(str_new) == 1:
if str_new not in '0123456789.':
return 0
# 解决多符号问题
for i in str_new:
if i in "-+":
fuhao += i
if len(fuhao)>1:
return 0
if not fuhao == '' and not fuhao == str[0]:
return 0
# 解决超出范围的问题
if int(float(str_new))>2**31-1:
return 2**31-1
elif int(float(str_new))<-2**31:
return -2**31
else:
return int(float(str_new))
输入
" -0012a42"
输出
-1242
预期结果
-12
实在不知道怎么改了。/摊手