码迷,mamicode.com
首页 > 其他好文 > 详细

String to Integer (atoi)

时间:2016-09-04 10:12:08      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

比较考验逻辑的一道题,需要考虑很多特殊样例,提交了10+次才过。

个人思路:分情况讨论,用if语句排除掉各种错误。

int myAtoi(char* str) {
  long long sum = 0;//开大点,用来判断是否在int的取值范围
  bool flag = true;//判断数字前是否有正负号,数字是正是负
  bool track = true;//判断数字前是否有空格
  bool track2 = true;//判断数字中间是否有空格
  for (int i = 0; str[i] != \0; i++) {
    if ((str[i] == + || str[i] == -) && track) { track = false; track2 = false; if (str[i] == -) flag = false; continue; }
    else if (str[i] == + || str[i] == -) return 0;
    if (str[i] >= 0 && str[i] <= 9 && flag) { 
      sum += str[i] - 0;
      if (sum > 2147483647) { return 2147483647; }
      track2 = false;
    }
    else if (str[i] >= 0 && str[i] <= 9 && !flag) { 
      sum -= str[i] - 0;
      if (sum < -2147483648) { return -2147483648; }
      track2 = false;
    }
    else if (str[i] ==   && track2) continue;
    else return sum;
    if (str[i + 1] != \0 && str[i + 1] >= 0 && str[i +1] <= 9) sum *= 10;
  }
  return sum;
}

分析:3ms过的,速度很快,但是相当于是自己造轮子,下面有个C++的解法超简单。

其他思路:

1.  部分利用库的C写法 by deepak50

int myAtoi(char* s)
{
     int i=0,sign,max=0;
     long long val=0;

     for(i=0;isspace(s[i]);i++)
         ;//isspace函数,当s[i]是空白符(空白符指空格、水平制表、垂直制表、换页、回车和换行符)时,返回非零。
     sign = (s[i]==-) ? -1:1;//判断正负,最后相乘。

if(s[i] == + || s[i] == -) i++;
for(val=0;isdigit(s[i]);i++) { //判断是否是数字,返回非零值,反之返回零。

val
=10*val+(s[i]-0);

if(val > INT_MAX) { max=1; break; }
}
if(max) { if(sign==1) return INT_MAX; else return INT_MIN; }

return val*sign;
}

2. 完全利用库的C++写法 by kybconnor

  istringstream sin(str);
  int ans=0;
  sin>>ans;
  return ans;

利用istringstream类的特性恰好符合本题要求的特点,非常抖机灵。(补充学习 <sstring>)

3. 部分利用库的C++写法 by morning_color

int myAtoi(string str) {
    long result = 0;
    int indicator = 1;
    for(int i = 0; i<str.size();)
    {
        i = str.find_first_not_of( );
        if(str[i] == - || str[i] == +)
            indicator = (str[i++] == -)? -1 : 1;
        while(0<= str[i] && str[i] <= 9) 
        {
            result = result*10 + (str[i++]-0);
            if(result*indicator >= INT_MAX) return INT_MAX;
            if(result*indicator <= INT_MIN) return INT_MIN;                
        }
        return result*indicator;
    }
}

4. 一个神奇的方法去判断溢出 by 

int atoi(const char *str) {
    int sign = 1, base = 0, i = 0;
    while (str[i] ==  ) { i++; }
    if (str[i] == - || str[i] == +) {
        sign = 1 - 2 * (str[i++] == -); 
    }
    while (str[i] >= 0 && str[i] <= 9) {
        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - 0 > 7)) { //接近溢出时,数字最后一位不得为8, 9
            if (sign == 1) return INT_MAX;
            else return INT_MIN;
        }
        base  = 10 * base + (str[i++] - 0);
    }
    return base * sign;
}

在那个if语句中,对INT_MIN的溢出判断是有逻辑问题的,但是输出没问题。因为当恰好为INT_MIN时,if判断其为溢出,返回的还是INT_MIN,所以测试能过。

还有就是7,最好改为INT_MAX % 10,更具有普遍性。

 

总结:欲想成其事,必先利其器。熟练运用各种常见库是非常有必要的。比如INT_MAX, INT_MIN,判断是否是空白符号这些,自己写简直蠢爆。

String to Integer (atoi)

标签:

原文地址:http://www.cnblogs.com/sofiaT/p/5838620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!