字符串算法 : int atoi(const char *npt
2018-01-12 本文已影响10人
SHAN某人
1. 算法描述
字符串函数---atoi()函数
功能:把字符串转换成整型数。非法字符返回 0
2. 题解
这个题看似挺简单,其实需要考虑的情况很多,因为输入的是字符串,你得考虑字符串的各种情况,然后你得跟面试官沟通字符串什么情况下是 非法字符,什么情况下是应该正确输入 整型。
这里我们假定 字符串允许首尾空格,允许中间出现 至多 一个小数点,除这些情况外,其他都是0-9的数字,不考虑其他进制,不考虑科学计数法等等 其他情况。
3. 算法源码
# 字符串函数---atoi()函数
# 功能:把字符串转换成整型数。非法字符返回 0
def strToNum(s):
if not s:
return 0
# 去掉前面后面的空格
s = s.strip()
l = list(s)
symbol = 1 if l[0] == '-' or l[0] == '+' else 0 # 符号位
containPoint = -1 # 是否包含小数点,记录小数点的位置
countPoint = 0 # 包含小数点的个数
result = 0
# 除数字外中间只允许小数点,不允许其他非数字字符,空格出现在中间也非法
for i in range(symbol,len(l)-1):
if l[i] == '.':
containPoint = i
countPoint += 1
continue
elif not str(l[i]).isdigit():
return 0
# 中间出现超过1个小数点,非法
if countPoint > 1:
return 0
# 中间出现小数点的处理,小数点及以后丢弃
print('countPoint {}'.format(countPoint))
print('point position {}'.format(containPoint))
newl =l
if containPoint > -1:
newl = l[0:containPoint]
result = 0
rate = 1
for e in newl[::-1]:
if e == '-' or e == '+':
continue
print(" e {}".format(e))
result = result + int(e)*rate
print("re {}".format(result))
rate = rate *10
if l[0] == '-':
result = - result
return result
print("{} {}".format(' 123 ',strToNum(' 123 ')))
print("{} {}".format(' +233.4 ',strToNum(' +233.4 ')))
print("{} {}".format(' -233.4 ',strToNum(' -233.4 ')))
print("{} {}".format(' 1323.3.3',strToNum(' 1323.3.3')))
print("{} {}".format(' 132 3',strToNum(' 132 3')))