题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入描述:

输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0
示例1

输入

复制
+2147483647
1a33

输出

复制
2147483647
0

解题关键点:对于字符类型的数字,该字符数字-'0'即为对应的整数类型对应的ASCII码值
刚开始的代码:太过冗余,且没有考虑溢出的情况
class Solution {
public:
    int StrToInt(string str) {
        int len = str.length();
        if(len == 0) return 0;
        int sum = 0;
        int number = 0;
        for(int i=1;i<len;i++){
            if(str[i]<'0' || str[i]>'9')//注意这里是str[i]<'0',而不是str[i]<"0",已经是一个字符了
                return 0;
            else{
                number = str[i] - '0';
                sum += number*pow(10.0, len-i-1);//这里可以优化为 sum * 10 + number
            }
        }
        if(str[0]=='+')
            return sum;
        else if(str[0]=='-')
            return -sum;
        else if(str[0]>='0' && str[0]<='9'){
            number = str[0] - '0';
            sum += number*pow(10.0, len-1);
            return sum;
        }
        else
            return 0;
            
    }
};

可能会出现异常的情况:

1.是否为空字符串

2. 是否会溢出

3. 第一个字符是正负号还是数字

优化后代码:
class Solution {
public:
    int StrToInt(string str) {
        int len = str.length();
        if(!len) return 0;
        int flag = 1;//判断是正数还是负数
        long long sum = 0;
        if(str[0]=='-')
            flag = -1;
        for(int i = (str[0]=='+'||str[0]=='-')?1:0;i<len;i++){
            if(str[i]<'0' || str[i]>'9')
                return 0;
            else{
                sum = sum*10+(str[i]-'0');
                if(sum<0)//如果出现为负的情况说明溢出
                    return 0;
            }
        }
        return sum * flag;
    }
};

 在leedcode中题目要求比较多,因此又进行了修改:

class Solution {
public:
    int strToInt(string str) {
        int len = str.length();
        if(!len) return 0;
        int flag = 0;//判断是正数还是负数
        long sum = 0;
        int i= 0;
        int number = 0;
        //去除开头空格
        while(str[i]==' ')
            i++;
        while(str[i]<'0' || str[i]>'9'){
            if(str[i]=='-'&&flag==0)
                flag = -1;
            else if(str[i]=='+'&&flag==0)
                flag = 1;
            else
                return 0;
            i++;
        }
        if(flag==0)
            flag = 1;
        
        for(;i<len;i++){

            if(str[i]<'0' || str[i]>'9'){
                break;
            }
            else{
                number = str[i]-'0';
                if(flag==1 && ((2147483647-number)/10<sum || 214748364<sum)){
                    return 2147483647;
                }else if(flag==-1 && ((2147483648-number)/10<sum || 214748364<sum)){
                    return -2147483648;
                }else{
                    sum = sum*10+(str[i]-'0');
                }
            }
        }
        return sum * flag;
    }
};

 



posted on 2020-09-22 21:53  曹婷婷  阅读(210)  评论(0)    收藏  举报