leetcode-字符串轉換爲整數(atoi)

題目

https://leetcode-cn.com/problems/string-to-integer-atoi/

思路

  • 首先去掉前置多餘空格
  • 判斷正負情況,需要注意出現兩個正負號的字符都return 0,例如“+-2”;
  • 接下來在剩餘的字符串中提取出數字即可,我們只需要判斷這個字符是不是0~9,用isdigit()函數判斷即可
  • 提取數字需要判斷溢出情況,不定義res爲long,而是通過判斷當前res*10加上下一個數字會不會大於2147483647即可,對於-2147483648這種情況,雖然邏輯上從我們的代碼上判定爲溢出,但是返回結果恰好等於-2147483648。
  • 另外一種黑科技就是用DFA自動機

AC代碼

#include <iostream>
#include <string>
using namespace std;

class Solution
{
public:
    int myAtoi(string str)
    {
        int i = 0;
        while (str[i] == ' ') //處理前置空格
            i++;
        int flag = 1;
        int res = 0;
        if (str[i] == '+')
        {
            i++;
        }
        else if (str[i] == '-') //特殊情況,'+-2'==》 0
        {
            i++;
            flag = -1;
        }
        while (i < str.size() && isdigit(str[i]))
        { //判斷是否爲數字
            int temp = str[i] - 48;
            //處理溢出
            // if(res > INT32_MAX / 10 || ((res == INT32_MAX/10) && temp > 7))
            if (res > (INT32_MAX - temp) / 10) //溢出判斷,這不用將res設置爲long
            //"-2147483648"雖然比INT32_MAX大,雖然判定位溢出,但是實際上不溢出的,我們的結果返回的正確的
                return flag == 1 ? INT32_MAX : INT32_MIN;

            res = res * 10 + temp;
            i++;
        }
        return flag*res;
    }
};
int main()
{
    string s = "-2147483648";
    Solution so;
    cout << so.myAtoi(s) << endl;
    return 0;
}

測試樣例

  • 正確的正數,負數
  • 溢出的正數,負數
  • 非法字符和數字的混合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章