1. 程式人生 > >面試題20:表示數值的字串

面試題20:表示數值的字串

題意:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路:

/*

合法的浮點數有兩種表示形式:

十進位制小數形式。他有數字和小數點組成,必須有小數點。例如(123.)(123.0)(.123)。

指數形式。如123e3。字母e(或E)之前必須有數字,e後面的指數必須為整數。

規範化的指數形式裡面,小數點前面有且只有一位非零的數字。如1.2345e8

*/

所以只需要考慮三種數值:

1:整數,只要判斷字串中是否只包含'+','-',[0~9]就可以了

2:小數,只要判斷字串中是否只包含'+','-',[0~9],'.';'.'的個數為1,就可以了

3:指數,先找‘e’或者‘E’,再找這個字元左邊的數和右邊的數,左邊可以為整數或者小數,右邊只能為整數。

class Solution {
public:
	bool integer(char* str)//整數
	{
		for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < strlen(str); i++)
		{
			if ( str[i] < '0' || str[i] > '9' )
				return false;
		}
		return true;
	}
	bool decimal1(char* str)//小數
	{
		int flag = 0;
		for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < strlen(str); i++)
		{
			if (str[i] < '0' || str[i] > '9')
			{
				if (str[i] == '.')
				{
					flag++;
					if (flag >= 2)
						return false;
				}
				else
					return false;
			}
		}
		return true;
	}
	bool decimal2(char* str)//指數
	{
		int flag = 0;
		int pos=-1;
		for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < strlen(str); i++)
		{
			if (str[i] < '0' || str[i] > '9')
			{
				if (str[i] == 'e' || str[i] == 'E')
				{
					pos = i;
					break;
				}
			}
		}

		char* left = new char[100];
		for (int i = 0; i < pos; i++)
			left[i] = str[i];
		left[pos] = '\0';

		char* right = new char[100];
		for (int i = pos + 1; i < strlen(str); i++)
			right[i - pos - 1] = str[i];
		right[strlen(str) - pos-1] = '\0';

		if (strlen(left) == 0 || strlen(right) == 0) return false;
		//cout << "left="<<left << endl;
		//cout << "right="<<right << endl;
		if ( (integer(left)||decimal1(left)) && integer(right) )
			return true;
		return false;
	}
	bool isNumeric(char* string)
	{
		if (integer(string) || decimal1(string) || decimal2(string))
			return true;
		return false;
			
	}

};