实现函数atoi,将字符串转为整数,具体要求如下:
1、 "42" 转成 42
2、 " - 42 43" 转成 -4243
3、 "4193 word" 转成4193
4、 "word 4193" 转成0
5、 "-91283472332" 转成-91283472332, 比−2^31还小,返回−2^31
基本思路是遍历字符串,遍历过程中,关键点是找到第一个非空字符,这个非空字符决定了接下来程序的走向。
如果第一个非空字符是+或者-,就决定了数值的正负,后面的工作是提取数值
如果第一个非空字符是数字,事情变得简单了,直接提取数值。
如果第一个非空字符既不是数字,也不是+或-,就是无效字符串,返回0即可。
提取数值的过程,用一个列表保存单个数字,直到遇到一个既不是数字也不是空格的字符或者遇到字符串末尾,将列表里的数值连接起来并用int转成数值。
程序的最后,要和最大值和小值比较。
# coding=utf-8
MAX_INT = 2**31-1
MIN_INT = -2**31
def atoi(string):
"""
将字符串转成int
:param string:
:return:
"""
if not isinstance(string, basestring):
return 0
if string == u'':
return 0
tag = 1 # 标识正负, 赋值为1表示为正
value = 0
for index, item in enumerate(string):
# 空字符不处理
if item == u' ':
continue
elif item in ('+', '-'):
if item == '-':
tag = -1
value = get_int(string, index)
break
elif item.isdigit():
value = get_int(string, index)
break
else:
return 0
value = tag * value
if value > MAX_INT:
value = MAX_INT
if value < MIN_INT:
value = MIN_INT
return value
def get_int(string, start_index):
"""
提取数值
:param string: 字符串
:param start_index: 数值开始部分
:return:
"""
lst = []
for index in range(start_index, len(string)):
if string[index] == u' ': # 空字符不用处理
continue
if string[index].isdigit(): # 遇到不是数字时结束
lst.append(string[index])
return int(''.join(lst))
if __name__ == '__main__':
print atoi("42")
print atoi(" - 42 43 ")
print atoi("4193 4 word")
print atoi("word 4193")
print atoi("-91283472332")
QQ交流群: 211426309