zoukankan      html  css  js  c++  java
  • LeetCode——8. String to Integer (atoi)

    一.题目链接:https://leetcode.com/problems/string-to-integer-atoi/

    二.题目大意:

      实现一个和C语言里atoi具有相同功能的函数,即能够把字符串转换成整型。例如:输入字符串“-123”,返回值为一个整数-123。

    三.题解:

      这道题也属于字符串处理类的题目,只要看懂题目所给定的规则就好了,题目给的规则大致如下:

    1.若一开始遇到连续的2空白字符,则忽略这些字符,直到遇到第一个非空白字符。

    2.若遇到的第一个空白字符为'+'或者'-',则只有下一个字符为数字字符时才继续执行,否则返回0。如果下一个字符为数字字符,那么就往后顺序判断字符是否为数字字符,直到遇到非数字字符(然后该字符之后的字符串就不用考虑了)。

    3.若遇到的第一个非空白字符为数字字符,则执行与第2步相同的操作,即往后顺序判断字符是否为数字字符,直到遇到非数字字符(然后该字符之后的字符串就不用考虑了)。(实际上相当于第一个出现的数字字符串)

    4.如果数字字符串转换成的数字大于INT_MAX(int所能表示的最大值),或者小于INT_MIN(int所能表示的最小值)的话,则返回INT_MAX或者INT_MIN。

    这里有需要注意的一点是:这道题不用考虑小数的问题,因为题目要求转化的是整型,不包括浮点型!!!

    看懂这道题目给定的规则后,实现就简单了,代码如下:

    class Solution
    {
    public:
        int myAtoi(string str)
        {
            int len = str.size();
            long long rs = 0;
            int i = 0;
            int flag = 1;//表示正负号
            while(i < len && str[i] == 32)
            {
                i++;
            }
            if(str[i] == '+')
            {
                flag = 1;
                i++;
                while(str[i] >= '0' && str[i] <= '9')
                {
                    rs = rs * 10 + str[i] - '0';
                    i++;
                    if(rs > INT_MAX)
                        break;
                }
    
            }
            else if(str[i] == '-')
            {
                flag = -1;
                i++;
                while(str[i] >= '0' && str[i] <= '9')
                {
                    rs = rs * 10 + str[i] - '0';
                    i++;
                    if(rs > INT_MAX)
                        break;
                }
            }
            else if(str[i] >= '0' && str[i] <= '9')
            {
                while(str[i] >= '0' && str[i] <= '9')
                {
                    rs = rs * 10 + str[i] - '0';
                    i++;
                    if(rs > INT_MAX)
                        break;
                }
            }
            else
                return 0;
            rs = rs *flag;
            if(rs > INT_MAX)
                return INT_MAX;
            else if(rs < INT_MIN)
                return INT_MIN;
            else
                return rs;
        }
    
    };
    

     该算法的时间复杂度为O(n),空间复杂度为O(1),这段代码有几处需要重点理解:

    1.字符转数字的操作为:rs = rs * 10 + str[i] - '0'。此处实际上与第7题反转数字(http://www.cnblogs.com/wangkundentisy/p/8059028.html)用了相同的道理,这么做的好处是不用事先知道字符串的长度。

    2.在while循环中有一步为:if(rs > INT_MAX)  break;为什么要加这一步?最后的判断不能的代替这一步吗?

    确实不能,因为rs 是long long型,这种数据类型占8个字节,它表示的范围也是有限的,所以当超过这个范围时,就会发生溢出,产生错误的返回值(例如:“1212121212121212121212121212121212121212”)。所以在字符串转化的过程中,一旦发现超过int的范围,就终止,就不会发生这种情况了。(之前我想的是把所有的rs都加完之后再考虑,这样就有可能发生上述情况,所以在rs增加的过程中判断才是比较合理的)。

  • 相关阅读:
    hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map
    hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
    hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
    hdu6441 Find Integer 求勾股数 费马大定理
    bzoj 1176 Mokia
    luogu 3415 祭坛
    bzoj 1010 玩具装箱
    bzoj 3312 No Change
    luogu 3383【模板】线性筛素数
    bzoj 1067 降雨量
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/8074667.html
Copyright © 2011-2022 走看看