atoi的实现

atoi

C语言中有一个函数实现了该功能,即将字符串转换为整数,记得曾经面试的时候考了这道题。自己用Python实现一下。

思路:能够正常转换成数字的字符串必须要满足每一个字符都是数字字符。因此要考虑所有不符合条件的情况:

  1. 空字符串,那没得说了。
  2. 字符串中含有别的字符(s-'0'大于9或者小于0);

还要考虑开头是加号或者减号。代码如下:

def atoi(string):
    if not string:
        raise ValueError('the string is empty')
    num,flag,start = 0,1,0
    if string[0] == '-':
        flag,start = -1,1
    elif string[0] == '+':
        start = 1
    for e in string[start:]:
        #Python中字符串不能直接相减,要转换为ASCII编码值;
        conv_int = ord(e) - ord('0')
        if conv_int < 0 or conv_int > 9:
            break
        num = num*10 + conv_int
     #如果字符串中含有不满足要求的字符,那么就会跳出循环,也就是说不会执行后续的else语句,这是Python的特性。
     else:
       #如果超过临界值,就应该设置num为临界值。
        bound = 2**31 -1
        if num > bound:
           num = bound
        return num*flag

    raise ValueError('the string is not valid')



print atoi('123')
print atoi('+123')
print atoi('-123')
print atoi('sd')

再来一个JAVA版本的:

 public static Integer atoi(String str){
        if (Objects.isNull(str)){
            return null;
        }
        int flag = 1;
//        flag = str.startsWith("+") ? 1 : -1;
        int start = 0;
        char head = str.charAt(0);
        if (head == '+'){
            start = 1;
        }else if (head == '-'){
            start = 1;
            flag = -1;
        }
        int sum = 0;
        while (start < str.length()){
            char cur = str.charAt(start);
            int curInt = (int) cur - (int)'0';
            System.out.println(curInt);
            if (curInt > 9 || curInt < 0){
                return null;
            }
            sum = sum * 10 + curInt;
            start++;
        }
        return flag * sum;
    }

--------EOF---------
微信分享/微信扫码阅读