前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【leetcode】String to Integer (atoi)

【leetcode】String to Integer (atoi)

作者头像
阳光岛主
发布2019-02-19 11:39:01
5780
发布2019-02-19 11:39:01
举报
文章被收录于专栏:米扑专栏米扑专栏

Question :

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.

Anwser 1 :

代码语言:javascript
复制
class Solution {
public:
    int atoi(const char *str) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        long long ret = 0;
        
        const char *p = str;
        
        while(*p == ' ') p++;
        
        bool valid = true;
        while(valid && *p == '+') {
            valid = false;
            p++;
        }
        
        while(*p == '0') p++;
        
        bool minus = false;
        if(*p == '-'){
            minus = true;
            p++;
        }
        
        while(*p != '/0'){
            if(*p >= '0' && *p <='9'){
                ret = ret * 10 + *p - '0';
                if(!minus && ret > INT_MAX) return INT_MAX; // positive and overflow
                if(minus && -ret < INT_MIN) return INT_MIN; // negative and overflow
                p++;
            } else {        // no digit then break
                break;
            }
        }
        
        return minus ? -ret : ret;
    }
};

注意点: 

1) 结果变量 ret 设为了长整形(long long),防止溢出; 最后结果由长整形自动截取为整形(int),返回

2) 计算得到结果时,需要配合正负符号判断是否已经越界,越界溢出后直接返回

Anwser 2 :

代码语言:javascript
复制
class Solution {
 public:
     int atoi(const char *str) {
         // Start typing your C/C++ solution below
         // DO NOT write int main() function
         assert(str != NULL);
         
         while(isspace(*str)) str++;  // remove ' '
             
             
         int sign = (*str == '-') ? -1 : 1;
         
         if (*str == '-' || *str == '+')    // if can check one char
             str++;
             
         int ret = 0;
         while(isdigit(*str))   // is digit
         {
             int digit = *str - '0';
             
             if (INT_MAX / 10 >= ret)
                 ret *= 10;
             else
                 return sign == -1 ? INT_MIN : INT_MAX;
                 
             if (INT_MAX - digit >= ret)
                 ret += digit;
             else
                 return sign == -1 ? INT_MIN : INT_MAX;
                 
             str++;
         }
         
         return ret * sign;
     }
 };

注意点:

1) 结果类型为整形(int),不需要转化,非常好!

2) 对空格(‘ ’)、数字(isdigit)都直接调用函数,非常简洁!

3) 对溢出全部采用减法(-)判断,有效预防了加法运算可能的溢出问题,非常值得借鉴!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013年04月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档