【剑指】20.表示数值的字符串

题目描述

  • 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串+100, 5e2, -123, 3.1416及-1E-16都表示数值,但12e, 1a3.14, 1.2.3, +-5及12e+5.4都不是。

算法分析

  • 表示数值的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC],其中A为整数部分,B为小数部分,C为指数部分;其中A,C均有+,-符号存在,但B无符号存在;
  • A,B存在不同时出现的情况,如.123及123.均为数字正确表示。
  • 当e或E前面没有数字(如e1)或后面没有整数(+12e5.4)时,整个字符串不能表示数字。

提交代码:

class Solution {
public:
	bool isNumeric(char* string)
	{
		if (!string)
			return false;

		bool numeric = scanInteger(&string);

		// 小数部分判断
		if (*string == '.')
		{
			++string;
			// 下面一行代码用||的原因:
			// 1. 小数可以没有整数部分,例如.123等于0.123;
			// 2. 小数点后面可以没有数字,例如233.等于233.0;
			// 3. 当然小数点前面和后面可以有数字,例如233.666
			numeric = scanUnsignedInteger(&string) || numeric;
		}

		// 判断科学表达部分
		if (*string == 'E' || *string == 'e')
		{
			++string;
			// 下面一行代码用&&的原因:
			// 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
			// 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4
			numeric = numeric && scanInteger(&string);
		}

		return numeric && (*string == '\0');
	}

	/* 扫描数字部分 */
	bool scanUnsignedInteger(char **str)
	{
		char *start = *str;
		while (**str != '\0' && **str >= '0' && **str <= '9')
			++(*str);

		return (*str) > start;
	}

	/* 扫描有符号数字部分 */
	bool scanInteger(char **str)
	{
		if (**str == '+' || **str == '-')
			++(*str);
		return scanUnsignedInteger(str);
	}
};

测试代码:

// ====================测试代码====================
void Test(char* testName, char* str, bool expected)
{
	if (testName != nullptr)
		printf("%s begins: ", testName);
	Solution s;
	if (s.isNumeric(str) == expected)
		printf("Passed.\n");
	else
		printf("FAILED.\n");
}


int main(int argc, char* argv[])
{
	Test("Test1", "100", true);
	Test("Test2", "123.45e+6", true);
	Test("Test3", "+500", true);
	Test("Test4", "5e2", true);
	Test("Test5", "3.1416", true);
	Test("Test6", "600.", true);
	Test("Test7", "-.123", true);
	Test("Test8", "-1E-16", true);
	Test("Test9", "1.79769313486232E+308", true);

	printf("\n\n");

	Test("Test10", "12e", false);
	Test("Test11", "1a3.14", false);
	Test("Test12", "1+23", false);
	Test("Test13", "1.2.3", false);
	Test("Test14", "+-5", false);
	Test("Test15", "12e+5.4", false);
	Test("Test16", ".", false);
	Test("Test17", ".e1", false);
	Test("Test18", "e1", false);
	Test("Test19", "+.", false);
	Test("Test20", "", false);
	Test("Test21", nullptr, false);

	return 0;
}


猜你喜欢

转载自blog.csdn.net/ansizhong9191/article/details/80664251