[LeetCode] Valid Number

2014-11-24 10:59:52 · 作者: · 浏览: 1

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图如下:

\


< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ytfPyKOs1eK49kRGQcbkyrW/ydLUvPK7r6O6zai5/bX308NTdHJpbme1xHRyaW23vbeoo6y/ydLUyKW19MrXzrK1xLbg0+BzcGFjZaOs1eLR+b/J0tTIpbX017TMrDjS1LywwO/D5sv509Cx6tPQc3BhY2W1xNPQz/Kx36GjPC9wPgo8cD7Wrrrzo6zOqsO/0ru49te0zKy2vLHg0LTSu7j2cGFyc2W3vbeooaPU2sO/uPZwYXJzZbe9t6jA76OsxuTKtb7Nwb249rK/t9ajujwvcD4KPHA+tdrSu7K/t9bKx7zssum2wda41evKx7fxtsG1vcHL19a3+7SuzrKyv6GjyOe5+7W9wcvOsrK/o6zU8sXQts+1scew17TMrMrHt/HOqtbVzKyjus6q1tXMrNTyt7W72HRydWWjrLfx1PK3tbvYZmFsc2WhozwvcD4KPHA+tdq2/rK/t9bKx7j5vt21scewyuTI67rN09DP8rHftcTD6Mr2vfjQ0Ne0zKzXqtLGo6y8tLXduem199PD19TJ7bvy1d/G5Mv8cGFyc2W3vbeooaPI57n70/a1vbfHt6jK5Mjr1PK/ydLUt7W72GZhbHNloaM8L3A+CjxwPjxicj4KPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;"> 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的代码。