leetcode--8--实现atoi函数

来源:互联网 发布:pop软件中文版下载 编辑:程序博客网 时间:2024/06/05 11:52
<span style="font-family:Times New Roman;font-size:18px;"></span>

原题: String to Integer (atoi)
 

Implement atoi to convert a string to an integer.

解答:

C++版本

int atoi(const char *str) {    int sign = 1, base = 0, i = 0;    while (str[i] == ' ') { i++; }if (str[i] == '-' )       {  sign = -1;  i++}else if (str[i] == '+' )    i++;       while (str[i] >= '0' && str[i] <= '9') {        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {            if (sign == 1) return INT_MAX;            else return INT_MIN;        }        base  = 10 * base + (str[i++] - '0');    }    return base * sign;}



Java版本

public int myAtoi(String str) {    int index = 0, sign = 1, total = 0;    //1. Empty string    if(str.length() == 0) return 0;    //2. Remove Spaces    while(str.charAt(index) == ' ' && index < str.length())        index ++;    //3. Handle signs    if(str.charAt(index) == '+' || str.charAt(index) == '-'){        sign = str.charAt(index) == '+' ? 1 : -1;        index ++;    }        //4. Convert number and avoid overflow    while(index < str.length()){        int digit = str.charAt(index) - '0';        if(digit < 0 || digit > 9) break;        //check if total will be overflow after 10 times and add digit        if(Integer.MAX_VALUE/10 < total || Integer.MAX_VALUE/10 == total && Integer.MAX_VALUE %10 < digit)            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;        total = 10 * total + digit;        index ++;    }    return total * sign;}


 

思路:

考虑4个问题

1、前导空格

2、正负号

3、溢出

4、非法输入

 

注意:

1、不合法的输入包括

  *24 、- 333  、 -+22  233t2 

但是本程序认为433322323233322t合法,因为会提前退出。

2、 if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7))

很重要,尤其是当base == INT_MAX / 10时,这个判断对于负数也是成立的,因为负数最小为-2147483648,当str[i] - '0'  == 8时,也恰好是INT_MIN。

 

 

 


0 0