首页 > 其他 > 详细

[LeetCode] Valid Number

时间:2014-03-20 09:48:54      阅读:401      评论:0      收藏:0      [点我收藏+]

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

这题一看就让我会想到当年学编译原理时写编译器的日子。这题实质其实就是编译器里的对number的词法分析,所以想直接使用DFA。感觉这题不太可能在面试里出现,题目不难,但是很耗时间,除非预先给出了DFA。我在这里借用了一个别人画的DFA,然后自己用递归调用的方法写出解析方法。DFA图如下:

bubuko.com,布布扣


首先,这个DFA其实可以简化:通过调用String的trim方法,可以去掉首尾的多余space,这样可以去掉状态8以及里面所有标有space的有向边。

之后,为每一个状态都编写一个parse方法。在每个parse方法里,其实就两个部分:

第一部分是检查读指针是否读到了字符串尾部。如果到了尾部,则判断当前状态是否为终态:为终态则返回true,否则返回false。

第二部分是根据当前输入和有向边的描述进行状态转移,即递归调用自身或者其它parse方法。如果遇到非法输入则可以返回false。


	private boolean parseState0(char[] charArr, int i) {
		if (i == charArr.length)
			return false;

		if (Character.isDigit(charArr[i])) {
			return parseState1(charArr, i + 1);
		} else if (charArr[i] == ‘+‘ || charArr[i] == ‘-‘) {
			return parseState3(charArr, i + 1);
		} else if (charArr[i] == ‘.‘) {
			return parseState2(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState1(char[] charArr, int i) {
		if (i == charArr.length)
			return true;

		if (Character.isDigit(charArr[i])) {
			return parseState1(charArr, i + 1);
		} else if (charArr[i] == ‘e‘ || charArr[i] == ‘E‘) {
			return parseState5(charArr, i + 1);
		} else if (charArr[i] == ‘.‘) {
			return parseState4(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState2(char[] charArr, int i) {
		if (i == charArr.length)
			return false;

		if (Character.isDigit(charArr[i])) {
			return parseState4(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState3(char[] charArr, int i) {
		if (i == charArr.length)
			return false;

		if (Character.isDigit(charArr[i])) {
			return parseState1(charArr, i + 1);
		} else if (charArr[i] == ‘.‘) {
			return parseState2(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState4(char[] charArr, int i) {
		if (i == charArr.length)
			return true;

		if (Character.isDigit(charArr[i])) {
			return parseState4(charArr, i + 1);
		} else if (charArr[i] == ‘e‘ || charArr[i] == ‘E‘) {
			return parseState5(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState5(char[] charArr, int i) {
		if (i == charArr.length)
			return false;

		if (Character.isDigit(charArr[i])) {
			return parseState7(charArr, i + 1);
		} else if (charArr[i] == ‘+‘ || charArr[i] == ‘-‘) {
			return parseState6(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState6(char[] charArr, int i) {
		if (i == charArr.length)
			return false;

		if (Character.isDigit(charArr[i])) {
			return parseState7(charArr, i + 1);
		} else {
			return false;
		}
	}

	private boolean parseState7(char[] charArr, int i) {
		if (i == charArr.length)
			return true;

		if (Character.isDigit(charArr[i])) {
			return parseState7(charArr, i + 1);
		} else {
			return false;
		}
	}

    public boolean isNumber(String s) {
        if (s == null)
			return false;

		// omit the leading and trailing space
		char[] charArr = s.trim().toCharArray();

		if (charArr.length == 0)
			return false;
		else
			return parseState0(charArr, 0);
    }

个人感觉虽然代码看起来很多,却非常的清晰,很轻松的就可以一遍写出bug free的代码。


[LeetCode] Valid Number,布布扣,bubuko.com

[LeetCode] Valid Number

原文:http://blog.csdn.net/whuwangyi/article/details/21563935

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!