1. 程式人生 > >8. 字串轉整數(atoi)

8. 字串轉整數(atoi)

實現 atoi,將字串轉為整數。

提示:仔細考慮所有輸入情況。如果你想挑戰自己,請不要看下面並自己考慮所有可能的輸入情況。

說明:這題解釋的比較模糊(即沒有指定輸入格式)。你得事先彙集所有的輸入情況。

atoi的要求:

這個函式需要丟棄之前的空白字元,直到找到第一個非空白字元。之後從這個字元開始,選取一個可選的正號或負號後面跟隨儘可能多的數字,並將其解釋為數字的值。

字串可以在形成整數的字元後包括多餘的字元,將這些字元忽略,這些字元對於函式的行為沒有影響。

如果字串中的第一個非空白的字元不是有效的整數,或者沒有這樣的序列存在,字串為空或者只包含空白字元則不進行轉換。

如果不能執行有效的轉換,則返回 0。如果正確的值超過的可表示的範圍,則返回 INT_MAX(2147483647)或 INT_MIN(-2147483648)。

說明:

假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231,  231 − 1]。如果數值超過可表示的範圍,則返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

思路:這題思路特別簡單,就是坑特別多,列舉如下:

1、空空空+156空X7

2、空空空-156空X7

3、空空空156空X7

4、空空空+X156空X7

5、“       ”

6、“”

只有1、2、3能得到正確的值,其他的情況都是0.

除此之外題目中說假設我們的環境只能儲存 32 位有符號整數,所以還要注意越界,一旦發生越界情況,要提前break。

數字部分算完了,也要break。

class Solution {
public:
    int myAtoi(string str) {
        int re=0, flag=1, newRe=0, j=0;
        for(int i=0; i<str.size(); ++i){
            if(isspace(str[i])) continue;
            if(isdigit(str[i])) j=i;
            if(str[i]=='+') j=i+1;
            if(str[i]=='-'){
                j=i+1;
                flag*=-1;
            }
            for(;j<str.size() && isdigit(str[j]); ++j){
                //只有32位儲存空間,關鍵是如何處理越界問題
                if(re>INT_MAX/10 || re==INT_MAX/10 && int(str[j]-'0')>7) 
                    return flag==1? INT_MAX: INT_MIN;
                re=re*10+int(str[j]-'0');
            }
            break;
        }
        return re*flag;
    }
};