力扣8.字符串转换整数

题目:传送门
题意: 这个题就是给你一个字符串,然后你提取出整数,这是题目的要求:
题目要求
我的思路就是直接暴力遍历一遍,找到符合条件的数字,暴力就很简单,但是这种问题必须要考虑全面,考虑出各种可能情况,因此写这种题必须要认真,如果不认真,你就可能这样:
在这里插入图片描述
所以考虑问题必须要全面,根据题目要求想到要面临的各种情况,两个‘+’,如何判断这个数字是否超出int范围,何时应该截断…
上代码:

class Solution {
public:
///-2147483648 - 2147483647
    int myAtoi(string s) {
        int flag,i,x=0;
       for(i=0;i<s.size();i++){
            if(s[i]==' ')
                continue;
            else if(s[i]=='+'||s[i]=='-'||(s[i]>=0&&s[i]>=9))
                break;
            else
                return 0;
       }
       if(s[i]=='-'){
           flag=-1;
           i++;
       }   
        else{
            flag=1;
            if(s[i]=='+')
               i++;
        }
        for(;i<s.size();i++){
            if(s[i]>='0'&&s[i]<='9'){
                int a=s[i]-'0';
               if(flag<0){
                  if(x>INT_MAX/10){
                      return INT_MIN;
                  }else if(x==INT_MAX/10){
                     if(a>=8){
                         cout<<"1"<<endl;
                         return INT_MIN;
                     }else{
                         x=-1*x*10-a;
                         if(i+1>=s.size())
                             return x;
                         else if(s[i+1]>='0'&&s[i+1]<='9')
                             return INT_MIN;
                         else
                             return x;
                     }
                  }else{
                    x=x*10+a;
                  }
               }else{
                  if(x>INT_MAX/10){
                      return INT_MAX;
                  }else if(x==INT_MAX/10){
                     if(a>=7){
                         return INT_MAX;
                     }else{
                         x=x*10+a;
                         if(i+1>=s.size())
                             return x;
                         else if(s[i+1]>='0'&&s[i+1]<='9')
                             return INT_MAX;
                         else
                             return x;
                     }
                  }else{
                      x=x*10+a;
                  }
               }
            }else{
                break;
            }
        }   
        return x*flag;
    }
};

这个代码我们一眼就能看出缺陷,代码长而且繁琐。虽然也是这道题的解法,但是并不好。然后我就看了力扣官方题解,官方给了一个自动机的题解,将各种状态进行保存,然后遍历字符,判断状态,让我们看看官方给的图:
在这里插入图片描述
这个图就包含了所有的情况,然后让我们看看官方的代码:

class Automaton {
    string state = "start";
    unordered_map<string, vector<string>> table = {
        {"start", {"start", "signed", "in_number", "end"}},
        {"signed", {"end", "end", "in_number", "end"}},
        {"in_number", {"end", "end", "in_number", "end"}},
        {"end", {"end", "end", "end", "end"}}
    };

    int get_col(char c) {
        if (isspace(c)) return 0;
        if (c == '+' or c == '-') return 1;
        if (isdigit(c)) return 2;
        return 3;
    }
public:
    int sign = 1;
    long long ans = 0;

    void get(char c) {
        state = table[state][get_col(c)];
        if (state == "in_number") {
            ans = ans * 10 + c - '0';
            ans = sign == 1 ? min(ans, (long long)INT_MAX) : min(ans, -(long long)INT_MIN);
        }
        else if (state == "signed")
            sign = c == '+' ? 1 : -1;
    }
};

class Solution {
public:
    int myAtoi(string str) {
        Automaton automaton;
        for (char c : str)
            automaton.get(c);
        return automaton.sign * automaton.ans;
    }
};

两个代码相比,就能发现官方给的代码简洁性和可读性都更加好。学无止境,加油在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赟家小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值