首頁>技術>

複雜度分析:

時間複雜度:O(n),其中 n為字串的長度。我們只需要依次處理所有的字元,處理每個字元需要的時間為 O(1)。

空間複雜度:O(1),自動機的狀態只需要常數空間儲存。

首先需要建立狀態轉移圖:

建立狀態轉移圖

我們就得出如下表格:

狀態轉移表格

程式碼實現:

//宏定義所有狀態#define START     0#define SIGNED    1#define IN_NUMBER 2#define END       3#define MAX_STATE 4
//將表格轉換為二維陣列int map[MAX_STATE][MAX_STATE] =    {        {START, SIGNED, IN_NUMBER, END},        {END,    END,       IN_NUMBER, END},        {END,    END,       IN_NUMBER, END},        {END,    END,       END,              END}    };

狀態之間的轉移,透過輸入的不同來驅動:

   if(' ' == s[i])            {                state = map[state][START];            }            else if('+' == s[i] || '-' == s[i])            {                state = map[state][SIGNED];            }            else if(s[i] >= '0' && s[i] <= '9')            {                state = map[state][IN_NUMBER];            }            else            {                state = map[state][END];            }

在不同的狀態,要實現不同的動作:

 if(state == START)            {                continue;            }            if(state == SIGNED)            {                if ('-' == s[i])                {//如果存在-符號,flag取為-1                    flag = -1;                }            }            if(state == IN_NUMBER)            {                if (ans  < IntMax / 10 || (ans  == IntMax / 10 && (s[i] - '0') < 8))                 {                    ans = ans * 10 + (s[i] - '0');                }                else                {                    return (flag == 1? IntMax:IntMin);                }            }            if(state == END)            {                break;            }

從提交結果來看,該方法還可以:

1082 / 1082 個透過測試用例

狀態:透過

執行用時: 4 ms

記憶體消耗: 5.6 MB

完整程式碼如下:

     #include<stdio.h>    #include<stdlib.h>    #include<string.h>    #define INTMAX  ((unsigned)(-1)>>1)    #define INTMIN  (~INTMAX)    //宏定義所有狀態    #define START     0    #define SIGNED    1    #define IN_NUMBER 2    #define END       3    #define MAX_STATE 4    int myAtoi(char * s)    {        int IntMax = INTMAX;        int IntMin = INTMIN;        int map[MAX_STATE][MAX_STATE] =        {//將表格轉換為二維陣列            {START, SIGNED, IN_NUMBER, END},            {END,   END,    IN_NUMBER, END},            {END,   END,    IN_NUMBER, END},            {END,   END,    END,       END}        };        int state = 0;        int ans = 0;        int flag = 1;        for (int i = 0; i < strlen(s); i++)        {           //狀態之間的轉移,透過輸入的不同來驅動:            if(' ' == s[i])            {                state = map[state][START];            }            else if('+' == s[i] || '-' == s[i])            {                state = map[state][SIGNED];            }            else if(s[i] >= '0' && s[i] <= '9')            {                state = map[state][IN_NUMBER];            }            else            {                state = map[state][END];            }            //在不同的狀態,要實現不同的動作:            if(state == START)            {                continue;            }            if(state == SIGNED)            {                if ('-' == s[i])                {//如果存在-符號,flag取為-1                    flag = -1;                }            }            if(state == IN_NUMBER)            {                if (ans  < IntMax / 10 || (ans  == IntMax / 10 && (s[i] - '0') < 8))                 {                    ans = ans * 10 + (s[i] - '0');                }                else                {                    return (flag == 1? IntMax:IntMin);                }            }            if(state == END)            {                break;            }                    }        return  flag * ans;      }    int main(){    char s[] = "-91";    int ans = myAtoi(s);    printf("%d\n", INTMAX);    printf("%d\n", ans);    return 0;}

LeetCode系列:

二叉樹系列:

8
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python資料預處理(九) 資料視覺化2