https://leetcode.com/problems/valid-number/
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.
解题思路:
这题目的考察主要在于测试,如何考虑各种测试用例,来使自己的程序变得完整和健壮。
具体实现有很多种方法,我这里用的是有限状态机(Finite-state machine)的方法,和 String to Integer (atoi) 很像。优点是可以避免很复杂的if判断条件,缺点是可能搞清楚每个状态代表什么意思比较麻烦。
这题目的边界情况非常多,比如.3就是一个数字,6e.3,“12.e+231”呢?具体就不仔细说了,其实题目至少应该标出来,那些格式是正确的,哪些是错误的。否则只能写出程序,然后根据test case一点一点调试了。
public class Solution { public boolean isNumber(String s) { if(s == null || s.length() == 0) { return false; } int state = 0, i = 0; s = s.trim(); while(i < s.length()) { if(state == 0) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 1; } else if(s.charAt(i) == '-' || s.charAt(i) == '+'){ state = 2; } else if(s.charAt(i) == ' ') { i++; continue; } else if(s.charAt(i) == '.'){ state = 3; } else { return false; } } else if(state == 1) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 1; } else if(s.charAt(i) == '.') { state = 4; //"3." } else if(s.charAt(i) == 'e') { state = 5; } else { return false; } } else if(state == 2) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 1; } else if(s.charAt(i) == '.') { state = 3; // " -." } else { return false; } } else if(state == 3) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 6; } else { return false;//".e1" } } else if(state == 5) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 7; } else if(s.charAt(i) == '-' || s.charAt(i) == '+') { state = 8; //" 005047e+6" } else { return false; } } else if(state == 6) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 6; } else if(s.charAt(i) == 'e') { state = 5; } else { return false; } } else if(state == 7) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 7; } else { return false; } } else if(state == 4) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 6; } else if(s.charAt(i) == 'e') { state = 5;//"46.e3" } else { return false; } } else if(state == 8) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 9; } else { return false; } } else if(state == 9) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9') { state = 9; //"4e+" } else { return false; } } i++; } if(state == 0 || state == 5 || state == 3 || state == 8) { return false; } return true; } }

浙公网安备 33010602011771号