
class Solution {
public:
int myAtoi(string str) {
//+- 12 返回類型為整形,所以不用考慮小數點,遇到小數點就返回了
int ret = 0;
int len = str.size();
if (len == 0)
{
return ret;
}
bool isminus = false; //正負號
//int numofpoint=0; //小數點
int i = 0;
while (str[i] == ' ')
{//處理空格
++i;
}
if (str[i] == '-')
{//開始為 - 符合
isminus = true;
i++;
}
else if (str[i] == '+')
{//開始為 + 符合要求
i++;
}
//處理完正負了
while (i < len)
{//越界問題,
if (str[i] >= '0' && str[i] <= '9')
{//正常數字
if (ret > 214748364 && !isminus)
{//乘以10後越界
return 2147483647;
}
else if (ret > 214748364 && isminus)
{//乘以10後越界
return 2147483648;
}
ret = ret * 10 + str[i] - '0';
if (ret >= 2147483647 && !isminus)
{//加上str[i]後越界
return 2147483647; //最大整數
}
else if (ret >= 2147483648 && isminus)
{//加上str[i]後越界
return 2147483648; //最小負整數
}
else if (ret < 0 && isminus)
{
return 2147483648;
}
++i;
}
else
{//不是正常數字
break;
}
}
if (isminus)
{//負數
return ret*(-1);
}
else if (ret < 0 && !isminus)
{
return 2147483647;
}
return ret;
}
};
這道題是實現C++庫中的 atoi 函數,拿到這個題的時候自信心一下子就報表了,so easy ,可是提交了好多次後還是無法通過。看似簡單的問題確實陷阱好多啊。我來分析一下這個題中需要注意哪些細節。
1. 空格,字符串數字之前可以有任意個空格,需要先處理這些空格。
2. ‘+’,‘-’ 這兩個符號只能出現一次,重復出現就返回0。
3. 越界問題,需要考慮兩種情況(1).在乘以10之前需要考慮乘以10後會不會越界 (2).加上個位數後會不會越界
4.正數越界返回最大的整形正整數,負數越界後返回最小的整形負數。
5.遇到非數字的符號返回現在所能表示的整數。