力扣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;
    }
};

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

おすすめ

転載: blog.csdn.net/qq_43840681/article/details/117746862