實現功能(atoi)

將字符串轉化爲int型整數:

1.當字符串中第一個數字之前既不是正負號也不是空格時,直接返回0。如“dakks   34”

2.當字符串中數據的大小超過整數的範圍時,返回int能表示的最大值或最小值。

3.當遇到“+-333”時返回0。

 

先上自己的代碼:


#define INT_MAX         (2147483647)
#define INT_MIN         (-2147483648)

int myAtoi(char* str) {
    int len = strlen(str); // 傳進來的字串長度
    int i = 0; // 輪詢字符串總長度
    int found = 0; // 用來表示是否找到第一個數字或符號
    long num = 0; 
    int plus_minus = 0;  // 用來表示找到的數字的正負號
    //printf("len = %d\r\n",len);
    
    while(i < len)
    {
        if((found == 0)&&(str[i] == ' '))
        {
            // 未找到數字之前,空格直接跳過
            i++;
            //printf("space\r\n");
            continue;
        }
        
        if((str[i] >= '0')&&(str[i] <= '9'))
        {
            found = 1;
            // 判斷是否超過正數的最大值
            if((plus_minus == 0)&&((num * 10+(str[i]-'0')) > INT_MAX))
            {
                //printf("return int max\r\n");
                return INT_MAX;
            }
            // 判斷是否超過負數的最小值
            else if((plus_minus == 1)&&((num * 10 - (str[i]-'0')) < INT_MIN))
            {
                //printf("return int min\r\n");
                return INT_MIN;
            }
            
            if(plus_minus == 0)
            {
                num = num * 10 + (str[i]-'0');    
            }
            else
            {
                num = num * 10 - (str[i]-'0');
            }
            //printf("num = %d,n = %d,plus_minus = %d,MAX = %d,MIN = %d\r\n",num,(str[i]-'0'),plus_minus,INT_MAX,INT_MIN);
        }
        else if(found == 1)
        {
            //printf("unuse char ,%c\r\n",str[i]);
            return (int)num;
        }
        else if((found == 0)&&(str[i] != '-')&&(str[i] != '+'))
        {
            //printf("unuse char ,%c\r\n",str[i]);
            return (int)num;
        }
    
        if((found == 0)&&(str[i] == '+'))
        {
            found = 1;
        }
        
        if((found == 0)&&(str[i] == '-'))
        {
            plus_minus = 1;
            found = 1;
        }
        i++;
    }
    
    return (int)num;
}

leetcode給出的參考代碼(至少代碼的簡潔程度上要比我自己的好很多,雖然執行的時間一樣(可能是因爲功能比較簡單吧)):

bool isSign(char c)
{
    return (c=='+' || c=='-');
}

bool isDigit(char c)
{
    return (c>='0' && c<='9');
}

int myAtoi(char* str) {
    int idx=0, rst=0; 
    long sign=0, num=0;
    
    if(NULL != str)
    {
        while(str[idx])
        {
            if((num*sign) >= INT_MAX || (num*sign) <= INT_MIN)
            {
                break;
            }
            
            if(isDigit(str[idx]))
            {
                num = num*10 + str[idx] - '0';
                sign = sign==0 ? 1 : sign;
            }
            else
            {
                if(num==0 && sign==0)
                {
                    switch(str[idx])
                    {
                        case '+': sign=1;   break;
                        case '-': sign=-1;  break;
                        case ' ': break;                        //skip space
                        default:  idx = strlen(str)-1; break;   //stop and return 0
                    }
                }
                else
                    break;
            }

            idx++;
        }
    }

    rst =  (num*sign >= INT_MAX) ? INT_MAX : (num*sign <= INT_MIN ? INT_MIN : (int)(num & 0x000000007FFFFFFF)*sign);
    
    return rst;
}

題目和參考代碼來自:https://leetcode.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章