剑指offer 算法 (综合)

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

解析:现在才发现,原来字符串转数字特蛋疼,很多细节,以前从来就没考虑过,鲁棒性啊!!! 

 首先,得定义个标志位LegitimateInput,表示串str是否为合法输入,初始化为1:合法输入。开始判断啦~~~若str空串,直接LegitimateInput置0,return 0退出;不是空串,那么,开始分析每个字符。定义标志minus表示是否为负数,初始化为-1。读首个字符,若为‘+’或者‘-’,minus置位,1:正,0:负,下标位pos+1;之后,开始逐个读字符计算数字,i从pos开始读至串尾,一旦出现非‘0’~‘9’之间的字符,LegitimateInput置0,sum置0,并退出循环(可以直接return 0);否则继续循环,每次计算一遍,还有判断数字是否上溢或下溢,并做处理。循环结束,若是正确合理输入,给LegitimateInput置1,并且若minus为-1,sum结果记得取反哦

反正,一切细心细心再细心,要考虑全部情况

class Solution {
public:
    int LegitimateInput = 1;//0:表示不合法输入 1:表示合法输入
    int StrToInt(string str) {
        if(str.size()==0)
        {
            LegitimateInput=0;
            return 0;
        }
        int sum=0;
        int minus=-1;//负数标志  1为负数
        int pos=0;//下标
        if(str[0] == '-')
        {
            minus=1;
            pos++;
        }    
        else if(str[0] == '+')
        {
            minus=0;
            pos++;
        }
        int i;
        for(i=pos;i<str.size();i++)
        {
            if(str[i] >= '0' && str[i] <= '9')
	            sum=sum*10+(str[i]-'0');
            else 
            {
                sum=0;
                LegitimateInput=0;
                break;
            }
            if(minus==0 && sum > 2147483647)
            {//上溢出
                sum=0;
                LegitimateInput=0;
                break;
            }
            if(minus==1 && sum < -2147483648)
            {//下溢出
                sum=0;
                LegitimateInput=0;
                break;
            }
        }
        if(sum == 0 && minus != -1 && str.size() == 1)
        {
			LegitimateInput=0;//正负号 直接结束
        }
        if(str[i]== '\0' && sum != 0)
        {
            if(minus==1)
                sum=-sum;
            LegitimateInput=1;
        }
        return sum;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值