zoukankan      html  css  js  c++  java
  • 剑指offer(48):把字符串转换成整数

    题目描述

    将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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;
        }
    };


  • 相关阅读:
    BZOJ 1066 [SCOI2007]蜥蜴 (最大流)
    Codeforces 1092 D2 Great Vova Wall (Version 2) (栈)
    BZOJ 1046 [HAOI2007]上升序列(LIS + 贪心)
    牛客练习赛34 D little w and Exchange(归纳)
    BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
    GTMD并查集!
    2018icpc南京现场赛-G Pyramid(打标找规律+逆元)
    drwxr-xr-x 2 root root 4096 06-29 14:30 Test 分段解释
    Linux里面非常重要的目录
    点击 触发 事件 的 jQuery 写法样式
  • 原文地址:https://www.cnblogs.com/ttzz/p/13715140.html
Copyright © 2011-2022 走看看