atoi

来源:互联网 发布:笔记本触摸屏锁定软件 编辑:程序博客网 时间:2024/06/14 09:38

最近有个面试让手写atoi函数,因为人家的项目是做底层虚拟机的,需要用C写底层代码。做了很久Python和Web,突然让用指针,心里犯糊涂。再加上时间有限,就直接用Python上手写了。由于当时有点感冒脑袋疼,再加上用记事本写代码有点紧张,最终写的自己都不忍直视。今天有空了,自己静下心来自己再写一次,记录下来。其实用C操作指针有一种控制的乐趣,而且应该运行速度更快些,以后再用C改写下。


关于atoi函数的定义:输入一个字符串,输出一个整数。另外有如下一些要求,

1.忽略前面的空白字符

2.开头可以有-或者+号

3.解析尽量多的十进制数字,如果碰到无法解析的其他字符,中断解析,返回已经解析出的整数

4.如果输入为空字符串,或者开始的字符为无法解析的字符,返回0

5.如果输入不是字符串,或者解析出来的整数超出机器可以表示的整数范围,行为是“未定义”


我对这些要求稍作修改,以让这个函数更具有包容性:

1.可以处理8进制和16进制数(如果要处理其它进制的数,需要给函数增加一个参数)

2.因为Python可以处理任意长度的整数,所以不存在大整数超范围的问题,这个比C更灵活


def atoi(s):    if s is None: return 0    if not type(s)==str: return 0    if len(s)==0: return 0    base = 0    s = s.strip()    neg = 0    i = 0    if s[i] == "-":        neg = 1        i+=1    if s[i] == "+": i+=1    if s[i]=='0':        if s[i+1].lower()=='x':            base = 16            i+=2        else:            base = 8            i+=1    else:        base = 10    s = s[i:]    result = 0    for c in s:        if c.isdigit():            c = ord(c) - ord("0")            if not c < base: break        elif c.isalpha():            c = ord(c.lower()) - ord("a") + 10            if not c < base: break        else:            break        result = result*base + c    return result if not neg else result*(-1)


测试Case如下:

print atoi(" 1")print atoi("1")print atoi("017")print atoi("-121")print atoi(object)print atoi(True)print atoi("-0xA")print atoi("-121v")print atoi(" -121v ")print atoi("0xffffffffffffffffffffffffffffffffffffffffff")

输出结果:

1
1
15
-121
0
0
-10
-121
-121
374144419156711147060143317175368453031918731001855
[Finished in 0.1s]

0 0
原创粉丝点击