【剑指Offer】面试题49:把字符串转化为整数

一:题目描述

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

输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0

输入

+2147483647
    1a33

输出

2147483647
    0

二:解题思路

刚看到题的是有以为很简单,只要判断字符串中是否存在除0--9以外的字符,如果有,返回0,如果没有返回转换后的字符串

错错错!!!

这道题其实考察了很多细节

对于字符串不合法的情况你能想到哪些

1.空字符串

2.包括0--9以外的字符

3.转换为整数的过程中,数字超过int类型的范围

4.只包含+-号

同时还有一个容易被忽略的地方,当字符串不合法,返回0,他与字符串只包含‘0’,返回数字0,怎么区别呢/?

采用全局变量的方式,true 代表字符串合法,返回的0是数字0,false代表返回的字符串不合法,0代表不合法

三:代码实现

class Solution {
public:
    //考虑str为空字符串,只有加减号,数太大溢出,包括其他符号
    //不合法字符返回的0,与真实数字返回的0,怎么区别
    bool isLegal=false;//true 代表返回的0是数值,  false 返回的的0 代表输入的字符串是非法的
    
    int StrToInt(string str) {
        
        if(str.length()==0 )  //str不可以与null 比较,null一般只与char *比较
            return 0;          //str.length()==0  ,str==""   str.empty()表示的含义是是等价的

        //if(str == null ||str.length()==0){  //所以str==null会报错
            //return 0;
        //}
        if(str.length()==1 && (str[0]=='+' || str[0]=='-'))
            return 0;
        
        int i=0;//记录str当前位置
        //判断第一位是否位+-
        bool symbol=true; //ture:+   false:-
        if(str[0]=='+')
            i++;
        if(str[0]=='-'){
            i++;
            symbol=false;
        }
        
        int digit=0;   
        for(i;i<str.length();i++){
            if(str[i]>='0' && str[i]<='9')
                digit=digit*10+(str[i]-'0');
            else
                return 0;  //出现0--9以外的字符,该字符串不合法,返回0,同时 isLegal=false
           // if(symbol && digit>0x7FFFFFFF)
                //return 0;  //
           // if(!symbol && (-1*digit)<0x80000000)
               // return 0;
            //记住每种类型的范围,很繁琐,C++提供了现成的宏定义
            if(symbol && digit>INT_MAX)
                return 0;  //(signed int )  //作用?
            if(!symbol && (-1*digit)<INT_MIN)
                return 0;
        }
        //遍历到字符串的最后,合法字符
        if(str[i]=='\0')
            isLegal=true;
        if(!symbol)
             return 0-digit;
        else
             return digit;
      
    }
};

 
 

  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值