昨天就看到说:今天武汉会有超强冷空气光临,果然没有迟到。早上在学校一广场边上的石凳子上读英语,冷风直嗖嗖的往衣服里钻,冻得我紧紧的抱住像200+斤的自己,边吃包子边发抖的读英语,这滋味怎一个爽字了得!!!
实现 atoi
,将字符串转为整数。
该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
这一题其实没什么算法可言,主要的困难就是每一种分类情况要分清楚,稍微弄混淆了就有可能出错,有几点注意的地方我提下:
- 题目所给的字符串里面可能会有空格符,这个对我们来说是不需要的,所以我们可以先用str.split()将原始字符串分割成几个不含空格符的子字符串,这样解题速度会更快些。
- 另外就是注意:我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
代码如下:
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
str_split = str.split()
str_list = []
if len(str_split) == 0:
return 0
for indice in range(len(str_split)):
if str_split[indice][0] == '-' and len(str_split[indice]) >= 2:
str_list.append('-')
for str_indice in range(1, len(str_split[indice])):
if '0' <= str_split[indice][str_indice] <= '9':
str_list.append(str_split[indice][str_indice])
else:
break
if len(str_list) == 1:
return 0
else:
str_copy = int(''.join(str_list))
if str_copy <= -2**31:
return -2**31
if str_copy >= 2**31 - 1:
return 2**31 - 1
return str_copy
elif str_split[indice][0] == '+' and len(str_split[indice]) >= 2:
for str_indice in range(1, len(str_split[indice])):
if '0' <= str_split[indice][str_indice] <= '9':
str_list.append(str_split[indice][str_indice])
else:
break
if len(str_list) == 0:
return 0
else:
str_copy = int(''.join(str_list))
if str_copy <= -2 ** 31:
return -2 ** 31
if str_copy >= 2 ** 31 - 1:
return 2 ** 31 - 1
return str_copy
elif '0' <= str_split[indice][0] <= '9':
for str_indice in range(len(str_split[indice])):
if '0' <= str_split[indice][str_indice] <= '9':
str_list.append(str_split[indice][str_indice])
else:
break
str_copy = int(''.join(str_list))
if str_copy <= -2 ** 31:
return -2 ** 31
if str_copy >= 2 ** 31 - 1:
return 2 ** 31 - 1
return str_copy
else:
return 0
执行时间你还别说,还算是很不错的,虽然代码较长,但还是挺欣喜的。
2019/5/18 12:03更新
至于各种分类情况我再强调一些细节,因为本题考查的也是各种情况的全面性。
- 首字符为"+", "-"符号,需要用标志符记录下来;
- 首字符为字母或其它非数字以及"+", "-"符号,说明当前字符串不合标准,立即退出返回0;
- 其他位置上只要不是数字,也立即退出返回前面得到的符合标准的字符串;
这儿有一种情况是题目中没有给出的,刷题时报错了,所以就想分享一下。就是类似于"3.1415"这样的浮点数,结果是'3",也就是说结果只识整数,不转化浮点数。
代码如下:
class Solution:
# 此题还需注意的就是类似于3.1415的浮点数的出现了
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
# 首先将给定字符串以空格符切分
str_split = str.split()
if len(str_split) == 0:
return 0
# 我们只需要考虑str_split[0]即可
detect_str = str_split[0]
# 分别定义选取字符串转为整数的起始和终止下标值
start = 0
end = 0
# 定义标志符来区分首字符是否为“+”“-”;“+”用1来表示,反之用-1表示
flag = 1
for index in range(len(detect_str)):
# 如果首字符为“+”“-”,则我们相应改变flag的值,并且都将start与end的值相应+1
if index == 0 and detect_str[index] in ["-", "+"]:
flag = 1 if detect_str[index] == "+" else -1
start += 1
end += 1
# 如果当前字符为字母,立即退出
elif detect_str[index].isdigit():
end += 1
# 其它的各种情况均不符合,立即退出
else:
break
# 通过start与end的值得到我们需要的整数,此处注意正负号
new_num = int(detect_str[start:end])*flag if start < end else 0
# 最后的结果别忘了其取值范围是[-2**31, 2**31-1]
return min(new_num, 2**31-1) if new_num >= 0 else max(new_num, -2**31)
if __name__ == "__main__":
init_str = "3.14159"
str_to_int = Solution().myAtoi(init_str)
print(str_to_int)
执行效率出奇的高,达到了100%