上海做网站好的公司/珠海seo推广

昨天就看到说:今天武汉会有超强冷空气光临,果然没有迟到。早上在学校一广场边上的石凳子上读英语,冷风直嗖嗖的往衣服里钻,冻得我紧紧的抱住像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 0for 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:breakif len(str_list) == 1:return 0else:str_copy = int(''.join(str_list))if str_copy <= -2**31:return -2**31if str_copy >= 2**31 - 1:return 2**31 - 1return str_copyelif 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:breakif len(str_list) == 0:return 0else:str_copy = int(''.join(str_list))if str_copy <= -2 ** 31:return -2 ** 31if str_copy >= 2 ** 31 - 1:return 2 ** 31 - 1return str_copyelif '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:breakstr_copy = int(''.join(str_list))if str_copy <= -2 ** 31:return -2 ** 31if str_copy >= 2 ** 31 - 1:return 2 ** 31 - 1return str_copyelse: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 = 0end = 0# 定义标志符来区分首字符是否为“+”“-”;“+”用1来表示,反之用-1表示flag = 1for index in range(len(detect_str)):# 如果首字符为“+”“-”,则我们相应改变flag的值,并且都将start与end的值相应+1if index == 0 and detect_str[index] in ["-", "+"]:flag = 1 if detect_str[index] == "+" else -1start += 1end += 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%
