Skip to content

Latest commit

 

History

History
103 lines (76 loc) · 2.97 KB

49.把字符串转换成整数.md

File metadata and controls

103 lines (76 loc) · 2.97 KB

49.把字符串转换成整数

题目描述

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

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

 

解题思路

  • 思路一,乘以10加下一个数。设置一个变量用来存储转换后的结果,每遍历一个字符如果是数字的话就把当前结果乘以10加上新的数,如果字符>='0'<='9'则该字符为数字,字符与数字之间的转换可以用字符减去'0'字符来得到,因为在ASCII编码中数字0-9是连着的,也可以用map即哈希表或者switch...case来进行。一旦发现不合法直接返回0

    • 开头的时候要把前面的空格滤掉,从第一个非空格的字符开始。

    • 正负号可以单独用一个变量来保存,可以是int也可以是bool类型,最后把正负号乘到结果中。

    • 结果可以用long long来保存,代码中可以判断结果是否对int越界。为什么不用long呢?在32位系统中,int, long int, long都是4字节,而long long为8字节。

    • 还可以设置一个枚举类型或者bool类型的全局变量,表示转换是否成功,这样就知道输出0的时候到底是因为转换失败了还是因为是输入的就是0

 

代码

  • 思路一,乘以10加下一个数。如果要求不严格的话可以不做溢出检测和首尾空格去除。
class Solution {
public:
    bool Success = true;
    int StrToInt(string str) {
        int length = str.size();
        if(length<1) {Success=false; return 0;}
        // 去掉开头的空格
        int p = 0;
        while(str[p] == ' ') p++;
        // 正负号,true为正,false为负
        bool posFlag = true;
        if(str[p]=='+'){p++;}
        else if(str[p]=='-'){posFlag=false; p++;}
        // 转换
        long long result = 0;
        while(p<length){
            // 合法输入
            if(str[p]>='0' && str[p]<='9'){
                result = result*10 + (str[p]-'0');
                p++;
                // 溢出检测
                if((posFlag && result>0x7FFFFFFF) || (!posFlag && result>0x80000000)){
                    Success =false;
                    return 0;
                }
            }
            // 去除结尾空格
            else if(str[p]==' '){p++; break;}
            // 非法输入
            else{
                Success = false;
                return 0;
            }
        }
        // 去除结尾空格
        while(p<length){
            if(str[p] != ' ') {Success=false; return 0;}
            p++;
        }
        
        return posFlag ? result : -result;
    }
};