LeetCode—实现字符串转化为int类型的函数

String to Integer (atoi)

在C++中将字符串类型转化为int类型,可以用到atoi函数,这个题目就是自己完成atoi,同时如果需要将string类型转化为int类型,那么需要先将string类型转化为char类型
int i ;
string str;
i = atoi(str.c_str()) 

这个题目比较简单,但是有很多的边界条件需要考虑
1:如果字符串前面有多个空格,那么应该忽略,直至第一个有效数据
2:注意正负号
3:在数字之后可能还有很多非数值的数据,应该舍弃
4:注意int类型的取值范围(-2147483648,2147483647)
下面是自己写的代码:

class Solution {
public:
    int atoi(const char *str) {
        int size = strlen(str);
        int i = 0;
        int rt = 0;
        int temp;
        char IsPlus = 1;
        while(str[i] == ' ')
        {
            i++;
        }
        if(((str[i] == '+') || (str[i] == '-')) && (i < size))
        {
            if(str[i] == '+')
            {
                IsPlus = 1;
                i++;
            }
            else
            {
                IsPlus = -1;
                i++;
            }
        }
        while((temp = IsValid(str[i])) == 0 && (i < size))
        {
            i++;
        }
        while((temp = IsValid(str[i])) >= 0 && (i < size))
        {
            if(rt*IsPlus > (2147483647-temp)/10) //<不能将数据加了之后再比较,因为可能已经溢出,数据则比较奇怪
            {
                return 2147483647;
            }
            if(rt*IsPlus < (-2147483648+temp)/10)
            {
                return -2147483648;
            }
            rt = rt*10+temp;
            i++;
        }
        return rt*IsPlus;
        
    }
    int IsValid(const char inputStr)
    {
        switch(inputStr)
        {
            case '0':
            return 0;
        
            case '1':
            return 1;
        
            case '2':
            return 2;
        
            case '3':
            return 3;
        
            case '4':
            return 4;
        
            case '5':
            return 5;
        
            case '6':
            return 6;
        
            case '7':
            return 7;
        
            case '8':
            return 8;
        
            case '9':
            return 9;
            
            default:
           return -1;
        
        }
    }
};
感觉自己写的代码比较冗余,在网上找到的比较好的代码:
class Solution {
public:
    int atoi(const char *str) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(str == NULL) return 0;
        
        bool sign = true;
        
        while (*str == ' ')//prefix ' '   
            str++;  
            
        if(*str == '+' || *str == '-')
        {
            if(*str == '+') sign = true;
            else sign = false;
            str++;
        } 
        
        long long ans = 0;
        while(*str >= '0' && *str <= '9')
        {
            ans = ans*10+(*str-'0');
            if(ans > INT_MAX) return sign == true ? INT_MAX : INT_MIN;
            str++;
        }
        
        if(sign == false) return (int)(-ans);
        else return (int)ans;
    }
};

相对于自己写的代码:
1:明知道用int类型,可能溢出导致数据不准确,那么定义的时候可以定义一个long long类型
2:在获取有char专为数字的时候,不应该用冗余的switch分支,*str-'0'简单很多


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值