专栏首页米扑专栏【leetcode】String to Integer (atoi)

【leetcode】String to Integer (atoi)

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 :

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 :

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【leetcode】Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle.

    阳光岛主
  • 【leetcode】Valid Parentheses

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', d...

    阳光岛主
  • 智能电视的未来在哪儿

      最近一段时间,不少软件公司侵入硬件市场。从Google到戴尔,从阿里、360到早已登场的小米和乐视……一个新的蓝海正在浮现。如果说电脑早已日落西山,智能手机...

    阳光岛主
  • 程序员进阶之算法练习(三十二)LeetCode专场

    题目链接 题目大意: 给出一个链表RandomListNode *next, *random; 每个节点有int值,有两个指针,一个指向下一个节点,一个指...

    落影
  • 5G标准来了!中国预计投资1.5万亿;黑客宣布无条件删除A站泄露数据库;美图开源DPoS算法;CMake 3.11.4发布

    第一阶段全功能完整版 5G 标准正式出台,带来“全功能”的 5G 网络能力。这一标准是 5G 发展的重要里程碑,下一步将投入商用阶段。

    程序员宝库
  • 看完知乎30W程序员关注的轮子哥的编程之路,我只想说,收下我的膝盖...

    vczh,本名陈梓瀚,因知乎的个人信息介绍上写有“专业造轮子”,所以江湖人称“轮子哥”。vczh大学时代就在微软实习,毕业后即加入微软。开始时是在微软上海,后来...

    乔戈里
  • 看完知乎轮子哥的编程之路,我只想说,收下我的膝盖...

    vczh,本名陈梓瀚,因知乎的个人信息介绍上写有“专业造轮子”,所以江湖人称“轮子哥”。vczh 大学时代就在微软实习,毕业后即加入微软。开始时是在微软上海,后...

    GitHubDaily
  • 16个Spring注解,你知道的有几个?

    标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.

    程序员追风
  • Spring中的18个注解,你会几个?

    https://m.toutiaocdn.com/i6693736960273416712

    好好学java
  • 16个Spring注解,你知道的有几个?

    标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.

    IT大咖说

扫码关注云+社区

领取腾讯云代金券