【LeetCode】String to Integer (atoi)(字符串转换整数 (atoi))

这道题是LeetCode里的第8道题。

题目要求:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^{31}2^{31} − 1]。如果数值超过这个范围,qing返回  INT_MAX (2^{31} − 1) 或 INT_MIN (−2^{31}) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−) 。

虽然题目那么长,但是这道题却很简单,因为题目已经举了很多的例子来为我们说明来很多的情况。

首先第一点:先判断第一个字符是否为空格、数字或是正负号。若首字符不是上述字符的任意一种,则直接输出0。若为空格则一直遍历字符至正负号或数字为止,同时标记数字的正负,使用变量flag表示,若为正则flag=1,若为负则flag=0;

然后用res做中间变量保存结果(res=res*10+此时遍历的数字大小)。但这里需要注意一点:就是res的范围。题目要求的最终结果是在 [−2^{31}2^{31} − 1],其实题目不这样要求我们也得不到该范围外的数,因为int类型变量的范围就是 [−2^{31}2^{31} − 1]。遍历过程中也要注意字符是否为数字。

最后题目输出的重点还是在范围上,需要注意一点就是范围的两边是不对称的,最小值是−2^{31},最大值是2^{31} − 1。

2^{31} − 1=2147483647,也就是说如果res>214748364或者res=214748364而且当前字符大小>=7时,此时数字就达到最大值了,超出这个范围res就会造成溢出,数据出错, 此时直接输出最大值INT_MAX。但因为正负范围不同,所以正负号要分别考虑,比较麻烦的地方就在这里。

解题代码:

static const auto speedup=[]{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    return 0;    
}();
class Solution {
public:
    int myAtoi(string str) {
        int i,res=0,flag;
        for(i=0;i<str.length();i++){
            if(str[i]==' ')continue;
            else if(str[i]>='0'&&str[i]<='9'){flag=1;break;}
            else if(str[i]=='+'){i++;flag=1;break;}
            else if(str[i]=='-'){i++;flag=0;break;}
            else return 0;
        }
        if(str[i]<'0'||str[i]>'9')return 0;
        for(;i<str.length();i++){
            if(res>214748364||res==214748364&&str[i]>='7'){
                if(res==214748364&&flag==0&&str[i]=='7')return -1*(res*10+str[i]-48);
                res=INT_MAX;break;
            }
            res=res*10+str[i]-48;
            if(i==str.length()-1||str[i+1]<'0'||str[i+1]>'9')break;
        }
        if(res==INT_MAX&&flag==0)return -1*res-1;
        if(flag)return res;
        return -1*res;
    }
};

提交结果:

哦,对了。关于代码还有一点就是:代码前五行是我根据别人运行时间短的搬过来的。这样就能有效的缩短运行速度。在竞赛中,遇到大数据时,为文件的读写提供一种更为快速方法。这个代码就是禁用了cin的兼容特性。Click

个人总结:

这种题可以说没有难点,就是判断条件的分析,当然可以在运行时间上做功夫,提高运行速度。

posted @ 2019-02-01 16:25  1000sakura  阅读(164)  评论(0编辑  收藏  举报