Skip to content

Latest commit

 

History

History
68 lines (60 loc) · 2.49 KB

65. Valid Number.md

File metadata and controls

68 lines (60 loc) · 2.49 KB

65. 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.

这道题作为leetcode的 H 难度题目我也反感,因为全是琐碎的corner cases。
但这道题也有可取之处,就是直接用一个for 或者while循环处理所有cases。

	public boolean isNumber(String s){
	//source: https://discuss.leetcode.com/topic/9490/clear-java-solution-with-ifs
		
	/**1. empty string ->false
	 * 2. space before or after -->true
	 * 3. 科学计数法: "2e+10", "2e-10", "2e10", “2e0" all true
	 * 4. 小数点,一旦出现后面必须有数字,前面必须有数字。 “2.” true. 
	 * */
		
		s = s.trim();
		
		boolean pointSeen = false;
	    boolean eSeen = false;
	    boolean numberSeen = false;
	    boolean numberAfterE = true; 
	    
	    for(int i=0; i<s.length(); i++) {
	        if('0' <= s.charAt(i) && s.charAt(i) <= '9') {
	            numberSeen = true;   
	            numberAfterE = true; //数字出现可能两处,第一是e前,第二是e后。
	            //一旦e出现,numberAfterE=false, 必须再进一次这个if, numAfterE才会设成true. 
	        } else if(s.charAt(i) == '.') {
	        	//e出现 或者 ‘.’已经存在,返回false
	            if(eSeen || pointSeen) {
	                return false;
	            }
	            pointSeen = true;
	        } else if(s.charAt(i) == 'e') {
	        	//e已经出现过,或者在e之前没有数字,返回false
	            if(eSeen || !numberSeen) {
	                return false;
	            }
	            numberAfterE = false; 
	            eSeen = true;
	        } else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
	        	//在没有e的情况下,出现正负号必须是首位。
	        	//如果正负号出现在其他位置,前面一个必须是e. 
	            if(i != 0 && s.charAt(i-1) != 'e') {
	                return false;
	            }
	            //跟正负号有关的其他情况,不处理。
	            //这段命令不能反过来写成:
	            //如果正负号是第一位,或者正负号前面是e, 有数字出现,就能return true. 
	         
	        } else {
	        	//除了上述情况之外,默认false. ""的情况涵盖了。
	            return false;
	        }
	    }
	    return numberSeen && numberAfterE;
		}