C++算法:字符串轉換整數 (atoi)

題目;

首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。
當我們尋找到的第一個非空字符爲正或者負號時,則將該符號與之後面儘可能多的連續數字組合起來,作爲該整數的正負號;假如第一個非空字符是數字,則直接將其與之後連續的數字字符組合起來,形成整數。
該字符串除了有效的整數部分之後也可能會存在多餘的字符,這些字符可以被忽略,它們對於函數不應該造成影響。
注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不需要進行轉換。在任何情況下,若函數不能進行有效的轉換時,請返回 0。

說明:

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

示例 1:

輸入: “42” 輸出: 42

示例 2:

輸入: " -42" 輸出: -42

示例 3:

輸入: “4193 with words” 輸出: 4193

示例 4:

輸入: “words and 987” 輸出: 0

示例 5:

輸入: “-91283472332” 輸出: -2147483648 解釋: 數字 “-91283472332” 超過 32 位有符號整數範圍。 因此返回 INT_MIN (-2^31) 。

思路:

先找到第一個非空字符,然後判斷是否爲數字或’+‘或’-’,然後除去數字串前面的所有0!!!
使用flag來表示正負號;使用一個vecotr存儲數字
使用vector最後拼接成一個數

代碼:

class Solution {
public:
    int myAtoi(string str) {
        
        //思路:先找到第一個非空字符,然後判斷是否爲數字或'+'或'-',然後除去數字串前面的所有0!!!
        //使用flag來表示正負號;使用一個vecotr<int>存儲數字
        //使用vector最後拼接成一個數
        
        //特殊情況 ""
        if(str.length() == 0)
            return 0;
        
        int i,j; //獲取第一個非空字符
        bool flag = 0;  //表示正數
        
        for(i=0; i< str.length(); i++)
            if(str[i] != ' ')
                break;
        
        //判斷
        if(( (str[i] < '0') || (str[i] > '9') ) && (str[i] != '+') && (str[i] != '-') )
            return 0;
        else if(str[i] == '-')
        {
            flag = 1;
            i++;
        }
        else if(str[i] == '+')
            i++;
            
        //當開始是0時!!!
        while(str[i]== '0')
            i++;
        
        cout<<i<<endl;
        vector<int> a;
        
        for(j=i; (j < str.length()) && ((str[j] >= '0') && (str[j] <= '9')); j++)
            a.push_back(str[j]-48);
        
        //將vector中的數字拼接成一個數
        j = a.size();
        
        if(j>10)
        {
            if(flag == 0)  //表示正數
               return INT_MAX;
            else
               return -2147483648;
        }
        
        else if(j == 0)
            return 0;
        
        else
        {
            //由於可能出現大於32位的數,所以用long
            long ret = 0;
            
            for(i = 0; i < j ; i++)
                ret += a[i] * pow(10, j - 1 - i);
            
            if(flag == 0)  //表示正數
            {
                if(ret > INT_MAX)
                    return INT_MAX;
                return ret;
            }
            else
            {
                if(ret > 2147483648)  //最小值
                    return -2147483648;
                return (int)(0 - ret);
            }
        }
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章