• 剑指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;
        }
    };


  • 相关阅读:
    数据分析业务知识
    Scipy
    python数据结构与算法(1)---时间复杂度
    RNN循环神经网络
    利用卷积神经网络处理cifar图像分类
    CNN卷积神经网络的构建
    卷积神经网络(简单)
    Tensorflow-逻辑斯蒂回归
    Tensorflow
    聚类-衡量指标
  • 原文地址:https://www.cnblogs.com/ttzz/p/13715140.html
Copyright © 2020-2023  润新知