題目
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;
}
測試樣例
- 正確的正數,負數
- 溢出的正數,負數
- 非法字符和數字的混合