考古题—剑指offer67:字符串转整数

以一个考古题开始新的一天,训练一下自己的代码能力,题意就不贴了,说下注意点吧:

  1. 先除去开始的空格
  2. 判断正负
  3. 开头的0舍去
  4. 溢出判断

我做了两个,第一段代码没有经过优化,一遍ac,但是问题很多,所以优化了一下成了第二段代码。

class Solution {
public:
    int strToInt(string str) {
        int len=str.length();
        if(len==0)
            return 0;
        int index=0;
        int sign=1;
        long long sum=0;
        while(Isspace(str[index]))	//跳过空格
        {
            index++;
        }
        if(Isnotlegal(str[index]))	//判断正负且判断是否是数字
        {
            if(str[index]=='+')
            {
                index++;
            }
            else if(str[index]=='-')
            {
                sign=-1;
                index++;
            }
            else
                return 0;
        }
        while(str[index]=='0')	//除去开头的0
        {
            index++;
        }
        int maxlen=0;
        while(!Isnotlegal(str[index]))	//判断溢出
        {
            sum=sum*10+str[index]-'0';
            index++;
            maxlen++;
            if(maxlen>10)
            {
                break;
            }
        }
        sum=sum*sign;
        if(sum<=INT_MIN)
        {
            return INT_MIN;
        }
        else if(sum>=INT_MAX)
        {
            return INT_MAX;
        }
        else
        {
            int res=sum;
            return res;
        }
        return 0;
    }

    bool Isspace(char c)
    {
        if(c==' ')
            return true;
        return false;
    }

    bool Isnotlegal(char s)
    {
        if(s<'0'||s>'9')
            return true;
        return false;
    }

};

这段代码虽然可以使用但是很明显不是最优解,首先,使用了long long类型来辅助计算,其次,代码比较冗余。
基于此基础上,对代码进行精简,主要对于溢出的判断,其实就是看加到这个数的时候是否出现了溢出,那我们其实可以在加之前先进行判断,而后选择是否加减,(其实第一版就要用此方法来着,但是为了追求速度,就先long过了),因此可以进行优化。
优化后代码如下:

class Solution {
public:
    int strToInt(string str) {
    	int len=str.length();
        if(len==0)
            return 0;
    	
        int sum = 0;
        int index = 0;
        int sign = 1;
        
        while (Isspace(str[index])) 
        	index++;
        
        if (str[index] == '-') 
        	sign = -1;
        
        if (str[index] == '-' || str[index] == '+') 
        	index++;
        
        while(index < len && Islegal(str[index])) {
            int tmp = str[index] - '0';
            // int范围 (-2147483648 ,2147483647),所以可以在num后缀前先判定是否可能溢出,溢出有两种情况,一个是无论后面加什么都会溢出,一个是当个位数小于最大的7时才不会溢出
            if ((sum > INT_MAX/10) || (sum == INT_MAX/10 && tmp > 7)) {
                return sign > 0 ? INT_MAX : INT_MIN;
            }
            sum = sum*10 + tmp;	//此处可以将开头的0去掉,0再加也是0
            index++;
        }
        return sign > 0 ? sum : -sum;
    }

    bool Isspace(char c)
    {
        if(c==' ')
            return true;
        return false;
    }

    bool Islegal(char s)
    {
        if(s<'0'||s>'9')
            return false;
        return true;
    }

};

以后要开始用java做题了,冲冲冲。
新的一天,加油!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值