陪你刷算法系列

字符串算法 : 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')))
上一篇 下一篇

猜你喜欢

热点阅读