程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 筆試題21 . LeetCode OJ (8)

筆試題21 . LeetCode OJ (8)

編輯:關於C++

\

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

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved