【牛客易错编程题】把字符串转换成整数

【牛客网】把字符串转换成整数

本题链接
题目描述

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

输入描述:

输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0

示例1
输入

+2147483647
1a33

输出

2147483647
0

【题意解析】
就是实现字符串转整数
【解题思路】:
将数字字符转化为整数,要注意十进制进位
例:字符‘123’转成数字
sum = 0
sum = sum * 10 + 1 = 1
sum = sum * 10 + 2 = 12
sum = sum * 10 + 3 = 123
【边界条件判断】
1.空字符串
2.正负号处理
3.数字串中出现非法字符
4.数组整数判断是否溢出,溢出则返回‘0’
【未修改代码】

 class Solution {
public:
    int StrToInt(string str) {
        if(str.empty())
        {
            return 0;
        }
        int symbol = 1;//标记正负号
        if(str[0] == '-')
        {
            symbol = -1;
            str[0] = '0';//字符零占位
        }
        if(str[0] == '+')
        {
            symbol = 1;
            str[0] = '0';//字符零占位
        }
        long long num = 0;
        for(int i = 0;i < str.size();i++)
        {
            if(str[i]<'0'  || str[i]>'9')
            {
                return 0;
                break;
            }
            else{
                num = num * 10;
                num = num  + (str[i]-'0');
            }
        }
        num = symbol * num;
        return num;
    }
};

【本题易错】
上面代码存在一个小问题,当时就有点懵逼,然后我想到了数据越界的可能性,首先将返回值由int改成long long类型,但是报错。原因是本题要求了非法返回零,但是怎么 判断它越界范围呢?
在这里插入图片描述
经过百度搜索才知道(原文链接:https://blog.csdn.net/u012604810/article/details/80290706):


> C++中`INT_MAX`和`INT_MIN`的用法 int4字节32位,根据二进制编码的规则, INT_MAX =
> 2^31-1=2147483647 INT_MIN= -2^31=-2147483648
> C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long8字节64位。 C/C++整型上下限INT_MAX INT_MIN及其运算
> 
> C中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。
> 
> 1. INT_MAX,INT_MIN数值大小 因为int4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN=
> -2^31.C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long8字节64位。
> 
> 2. 关于INT_MAX INT_MIN的运算 由于二进制编码按原码、补码和反码的规则进行运算,所有程序中对INT_MAX和INT_MIN的运算应当格外注意,在出现溢出的时候,不遵循数学规则。
> 
> INT_MAX + 1 = INT_MIN
> 
> INT_MIN - 1 = INT_MAX
> 
> abs(INT_MIN) = INT_MIN
> 
> 比较有趣的是,INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.

最终解决问题:
【正确代码】

class Solution {
public:
    int StrToInt(string str) {
        if(str.empty())
        {
            return 0;
        }
        int symbol = 1;//标记正负号
        if(str[0] == '-')
        {
            symbol = -1;
            str[0] = '0';//字符零占位
        }
        if(str[0] == '+')
        {
            symbol = 1;
            str[0] = '0';//字符零占位
        }
        long long  num = 0;
        for(int i = 0;i < str.size();i++)
        {
            if(str[i]<'0'  || str[i]>'9')
            {
                return 0;
                break;
            }
            else{
                num = num * 10;
                num = num  + (str[i]-'0');
            }
        }
        num = symbol * num;
       if(num > INT_MAX || num < INT_MIN)
            return 0;
        return num;
    }
};

【本题总结】
1.本题思路不难,但是要注意的边界条件较多
2.类型溢出后的判断INT_MAXINT_MIN的使用

发布了34 篇原创文章 · 获赞 107 · 访问量 8563

猜你喜欢

转载自blog.csdn.net/qq_43676757/article/details/105327854