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.遇到非數字的符號返回現在所能表示的整數。