天天看點

leetcode8-字元串裝整形(atoi)--注意越界思路:代碼:

8. 字元串轉換整數 (atoi)

請你來實作一個 atoi 函數,使其能将字元串轉換成整數。

首先,該函數會根據需要丢棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。接下來的轉化規則如下:

如果第一個非空字元為正或者負号時,則将該符号與之後面盡可能多的連續數字字元組合起來,形成一個有符号整數。

假如第一個非空字元是數字,則直接将其與之後連續的數字字元組合起來,形成一個整數。

該字元串在有效的整數部分之後也可能會存在多餘的字元,那麼這些字元可以被忽略,它們對函數不應該造成影響。

注意:假如該字元串中的第一個非空格字元不是一個有效整數字元、字元串為空或字元串僅包含空白字元時,則你的函數不需要進行轉換,即無法進行有效轉換。

在任何情況下,若函數不能進行有效的轉換時,請傳回 0 。

提示:

本題中的空白字元隻包括空格字元 ' ' 。

假設我們的環境隻能存儲 32 位大小的有符号整數,那麼其數值範圍為 [−231,  231 − 1]。如果數值超過這個範圍,請傳回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

思路:

其實思路很簡單,主要主要邊界條件

if(sum > 214748364 || (sum == 214748364 && str[i] >= '8'))

                return -2147483648;

if條件中的str[i] >= '8'等号的條件必須在此時傳回,不然在下邊sum計算和的地方會越界。

sum = sum * 10 + str[i] - '0';

看到了越界,-_-||,從左到右的計算原則,sum = 214748364, 會先計算sum * 10 + str[i],造成越界

可以改為 sum = sum * 10 + (str[i] - '0'); 或者 sum = sum * 10 - '0' + str[i] ;

代碼:

int myAtoi(char * str){
    int i = 0;
    int flag = 1;
    int sum = 0;
    if(str == NULL)
        return 0;
    while(str[i] == ' ' && str[i] != '\0')
        i++;
    if(str[i] < '0' || str[i] > '9')
        if(str[i] == '-')
        {
            flag = -1;
            i++;
        }
        else if(str[i] == '+')
            i++;
        else
            return 0;
    while(str[i] >= '0' && str[i] <= '9')
    {
        if(flag == 1)
        {
            if(sum > 214748364 || (sum == 214748364 && str[i] >= '7'))
                return 2147483647;
        }
        else 
        {
            if(sum > 214748364 || (sum == 214748364 && str[i] >= '8'))//='8'需要在此處傳回,不然在下邊sum計算會越界。
                return -2147483648;
        }
        //sum = sum * 10 + str[i] - '0';//竟然越界,-_-||,從左到右的計算原則,加括号就好
        //也可以寫成sum = sum * 10 - '0' + str[i];
        sum = sum * 10 + (str[i] - '0');
        i++;
    }

    sum = sum * flag;
    return sum;
}
           

繼續閱讀