剑指 Offer 67-把字符串转换成数字C++

题目描述

在这里插入图片描述
在这里插入图片描述

解法 逐个元素分析

关键就是要读懂题目要求
1.第一个非空字符必须是数字或者‘+’‘-’号。
2.从第一个非空字符开始直到数字结束就是所求数字。
边界情况:
1.当转换的数字是正数且超过INT 上限,直接转换为INT_MAX。
2.当转换的数字为负数且超过INT 上限,转换为 -INT_MAX,这里要注意负数的绝对值的最大值在补码中比正数大1。

if(ans >= INT_MAX && flag == 1) return INT_MAX;
//注意这里不是大于等于,负数补码的最大绝对值为整数最大值+1
if(ans > INT_MAX && flag == -1) return INT_MIN;

转换过程:
ans初始值为0
ans = ans * 10 + str[i] - ‘0’
比如数字 4231
ans = 0 * 10 + 4 = 4
ans = 4 * 10 + 2 = 42
ans = 42 * 10 + 2 = 423
ans = 423 * 10 + 1 = 4231

class Solution {
    
    
public:
    int strToInt(string str) {
    
    
        int flag = 1;
        long ans = 0;
        int index = 0;
        //i停留在第一个不是空格的地方
        while(str[index] == ' ') index++;
        if(str[index] == '-') {
    
    
            flag = -1;
            index++;
        }
        else if(str[index] == '+') index ++;
        //isdigital函数可以判断字符是不是数字
        for(; index < str.size() && isdigit(str[index]); index ++) {
    
    
            ans = ans*10 + (str[index] - '0');
            if(ans >= INT_MAX && flag == 1) return INT_MAX;
            //注意这里不是大于等于,负数补码的最大绝对值为整数最大值+1
            if(ans > INT_MAX && flag == -1) return INT_MIN;
        }
        return flag * ans;
    }
};

在这里插入图片描述
还有几年没用的isdigital函数,可以判断字符是否为数字字符
时间复杂度O(N)
空间复杂度O(1)

猜你喜欢

转载自blog.csdn.net/qq_42883222/article/details/112845393
今日推荐