LeetCode-8:字符串转换整数(atoi)

一、题目描述

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

二、题目分析

  • 这是剑指Offer上的原题的弱化版本
  • 首先光标移动到第一个不为' '的地方,检查是不是数字或者正负号,如果不是直接返回0
  • 检查光标处是否为数字,不是就返回0;否则就找到字符串里在光标后第一个不为数字的位置,或者找到字符串结尾而终止
  • 把这两个位置中间的字符转化为数字,在设置sum变量时,设置类型为long以免溢出

三、题目辨析

再来说这道题为什么是弱化过的剑指Offer上的原题

  • 考虑下面两种情况
    • 字符串无效,返回0
    • 字符串正确,正确结果本身就是0

那我们怎么区分到底发生了哪一种情况呢?显然我们无法区分
这就需要我们设置一个全局标志量,用以区分当返回值是0时,到底是正确返回0还是字符串错误返回0,但是这道题并没有要求

四、解题代码

class Solution {
public:
    int myAtoi(string str) {
        bool IsPos = 1;
        if(!str.size())  return 0;
        int pos = 0;
        while(str[pos] == ' '){
            pos++;
        }
        if((str[pos] == str.size()) || !((str[pos] >= '0' && str[pos] <= '9') || (str[pos] == '+' || str[pos] == '-'))){
            return 0;
        }
        if(str[pos] == '-' || str[pos] == '+'){
            IsPos = (str[pos] == '-' ? 0 : 1);
            pos++;
            if(str[pos] < '0' || str[pos] > '9')
                return 0;
        }
        
        int end = pos;
        while(str[end] >= '0' && str[end] <= '9' && end < str.size()){
            end++;
        }
        long sln = 0;
        for(int i = pos; i < end; i++){
            if(IsPos){
                if(sln * 10 + (str[i] - '0') <= INT_MAX)
                    sln = sln * 10 + (str[i] - '0');
                else
                    return INT_MAX;
            }
            else{
                if(sln * 10 - (str[i] - '0') >= INT_MIN)
                    sln = sln * 10 - (str[i] - '0');
                else   
                    return INT_MIN;
            }
        }
        return sln;
    }

};

五、运行结果

在这里插入图片描述

发布了30 篇原创文章 · 获赞 3 · 访问量 819

猜你喜欢

转载自blog.csdn.net/weixin_44587168/article/details/105297253