leetcode第65題擊敗100%用戶的答案

 

#include <iostream>
#include <vector>
#include<numeric>
#include<unordered_map>
#include<string>
using namespace std;


bool isNumber(string s)
{
	//先去除兩邊空白
	int n = s.size();
	if (n < 1)  return false;
	int left = 0;
	int right = n-1;
	while (left < n - 1 && s[left] == ' ') left++;
	while (right > left && s[right] == ' ') right--;

	int pre = 0;
	//exp 1 e
	//sign 2 正負號
	//dot 3 點
	//num 4 0-9數字

	//出現了小數點exp,後面不能有小數點
	bool afterExp = false;
	//出現了小數點,不能再出現了
	bool dot_once = false; 
	//出現了小數點,不能再出現了
	bool exp_once = false;

	for (int i = left; i <= right; i++)
	{
		//只有一位必須是數字
		if (left == right && (s[i] < '0' || s[i] > '9')) return false;

		//只要校驗位置,和左邊的性質(不能出現的exp num sign dot)
		if (s[i] =='e')
		{
			if (i == right || i == left ||pre<3|| exp_once)
				 return false;
			else 
			{
				pre = 1;
				afterExp = true;
				exp_once = true;
			}
		}
		else if(s[i] == '+' or s[i] == '-')
		{
			if ((i != left && pre!=1) || i == right ||pre>1)
				 return false;
			else
			{
				pre = 2;
			}
		}
		else if (s[i] == '.')
		{
			if (pre==3||afterExp|| dot_once)
				return false;
			//.e1是錯誤的,點不能兩邊都不是數字,左邊如果不是數字,右邊就一定要有數字
			else if (pre!=4 && (i == right || (s[i+1] < '0'|| s[i+1] > '9')))
			{
				return false;
			}
			else
			{
				pre = 3;
				dot_once = true;
			}
		}
		else if (s[i]>='0'&& s[i] <='9')
		{	
			pre = 4;
			
		}
		else return false;
	}
	return true;
}

#if 1
int main()
{
	vector<string> vec;
	vec.push_back("");//false
	vec.push_back("  ");//false
	vec.push_back("3.");//true
	vec.push_back(".e1");//false
	vec.push_back("0");//true
	vec.push_back(" 0.1 ");//true
	vec.push_back("abc");//false
	vec.push_back("1 a");//false
	vec.push_back("2e10");//true
	vec.push_back(" -90e3   ");//true
	vec.push_back(" 1e");//false
	vec.push_back("e3");//false
	vec.push_back(" 6e-1");//true
	vec.push_back(" 99e2.5 ");//false
	vec.push_back("53.5e93");//true
	vec.push_back(" --6 ");//false
	vec.push_back("-+3");//false
	vec.push_back("95a54e53");//false
	vec.push_back("95e54e53");//false
	vec.push_back("+.8");//true
	vec.push_back(" 005047e+6");//true
	vec.push_back("+1.e+5");//true
	vec.push_back(".1.");//false
	vec.push_back("-e58"); //false

	for (vector<string>::iterator ite=vec.begin();ite!=vec.end();ite++)
	{
		
		cout<<*ite<<":"<< isNumber(*ite) << endl;
	}
	while (1);
}
#endif

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章