剑指 Offer 67. 把字符串转换成整数

首先,字符串中可能出现的字符包括空格、数字、正负号、大小写字母、标点符号

并且 如果字符串内有数字,如果不是在最开始,那么在中间的数字也不算有效的、可转换的,所以第一个非空字符要么是负号‘-’,要么是数字

a按照自己的理解,写了一份:

class Solution {
public:
    int strToInt(string str) {
        int len_str = str.size();
        if(len_str == 0)return 0;       //空字符串
        int i = 0;
        int sign_flag = 1;
        while(i < len_str && str[i]==' ')i++;
        if( i == len_str)return 0;     //只包含空白字符
        if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))return 0;  //是大小写字母
        if( str[i] == '-'){
            sign_flag = -1;
            i++;
        }
        else if( str[i] == '+'){
            sign_flag = 1;
            i++; 
        }
        string s_to_int;
        while( i < len_str && str[i] == '0')i++;
        while( i < len_str && (str[i] - '0')>=0 && (str[i] - '0')<=9 ){
            // s_to_int.append(str[i]);
            s_to_int+=str[i];
            i++;
        }
        long long int_from_str = 0;
        // int_from_str = (s_to_int - "0")*sign_flag;
        // 字符串s_to_int转成数字int_from_str,需要区分个位、十位等
        long long digit = 1;
        int ll = s_to_int.size();
        for( int j = ll-1 ; j >=0 ; j-- ){
            char c = s_to_int[j];
            int_from_str += (c-'0')*digit;
            digit *= 10;
        }
        int_from_str *= sign_flag;
        if( int_from_str >= INT_MAX)return INT_MAX;
        if( int_from_str <= INT_MIN)return INT_MIN;
        return (int)int_from_str;
    }
};

 但是对于有很多0的情况比如 s = "  0000000000012345678"以及超过32位整数表示范围的这种情况 这份code还handle不了:

 就是应该怎么处理越界呢?

题解面试题67. 把字符串转换成整数(数字越界处理,清晰图解) - 把字符串转换成整数 - 力扣(LeetCode) (leetcode-cn.com)

 而且这里有一点和我之前写的思路不一样的地方还在于如何从纯数字字符串得到对应的数字,我之前写的是倒着加的,就是从个位开始加,这样会比较难判断如何越界,而如果从高位开始,每次×10,就更容易判定是否越界

class Solution {
public:
    int strToInt(string str) {
        int len_str = str.size();
        if(len_str == 0)return 0;       //空字符串
        int i = 0;
        int sign_flag = 1;
        int bndry = INT_MAX/10;  // -2147483648~2147483647
        while(i < len_str && str[i]==' ')i++;
        if( i == len_str)return 0;     //只包含空白字符
        if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))return 0;  //是大小写字母
        if( str[i] == '-'){
            sign_flag = -1;
            i++;
        }
        else if( str[i] == '+'){
            sign_flag = 1;
            i++; 
        }
        // string s_to_int;
        long long int_from_str = 0;
        // long long digit = 1;
        // int ll = s_to_int.size();
        while( i < len_str && str[i] == '0')i++;
        while( i < len_str ){
            if((str[i] - '0')>=0 && (str[i] - '0')<=9){
                // s_to_int+=str[i];
                if((int_from_str> bndry) || ((int_from_str==bndry)&& (str[i]>'7')))
                return sign_flag == -1? INT_MIN:INT_MAX;
                int_from_str = 10 * int_from_str + (str[i] - '0');
                i++;
            } 
            else break;
        }
        // for( int j = ll-1 ; j >=0 ; j-- ){
        //     char c = s_to_int[j];
        //     int_from_str += (c-'0')*digit;
        //     digit *= 10;
        // }
        int_from_str *= sign_flag;
        // if( int_from_str >= INT_MAX)return INT_MAX; //如果能比较 那就能存储下了 所以这两句话没有意义orz
        // if( int_from_str <= INT_MIN)return INT_MIN;
        return (int)int_from_str;
    }
};

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值