[LeetCode] Valid Number
题目链接: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.
针对本题可能存在的疑惑
1) 字符串中的空格如何处理?
回答:字符串头和字符串尾的空格可直接去除,如果字符串中间包含空格,形如“1 1”的,则为false
2)如果数字之后包含非数字字符是否有效?
回答:无效
3)如果字符串首字符为’+’或者’-’,是否有效?
回答:有效
4)是否只考虑十进制?十六进制是否需要考虑(例如0xFF)?
回答:只需考虑十进制
5)是否需要考虑指数,例如“1e10”
回答:需要考虑
方法一: 传统方法
首先将问题简化为不考虑指数
解题方法:将问题分解为几个独立的部分
将字符串从左到右分割成四个子串
1)字符串前端空格(可选)
2)加号(+)或者减号(-)(可选)
3)数字
4)字符串尾端空格(可选)
首先忽略1)2)4),判断3)是否为有效数字。
一个数字可以为整数或者小数,判断为整数的条件(仅包含digit)
判断为小数的条件(a. 整数部分;b. 小数点; c. 小数部分。注:a和b都为可选项,但是必须出现一个)
1 public boolean isNumberSimpilfy(String s){ 2 int i = 0; 3 int len = s.length(); 4 //Whitespace 5 while(i < len && Character.isWhitespace(s.charAt(i))){ 6 i++; 7 } 8 //'+' or '-' 9 if(i < len && (s.charAt(i) == '+' || s.charAt(i) == '-')){ 10 i++; 11 } 12 //digit before '.' 13 boolean isNumeric = false; 14 while(i < len && Character.isDigit(s.charAt(i))){ 15 i++; 16 isNumeric = true; 17 } 18 //'.' 19 if(i < len && s.charAt(i) == '.'){ 20 i++; 21 } 22 //digit after '.' 23 while(i < len && Character.isDigit(s.charAt(i))){ 24 i++; 25 isNumeric = true; 26 } 27 //Whitespace 28 while(i < len && Character.isWhitespace(s.charAt(i))){ 29 i++; 30 } 31 return isNumeric && i == len; 32 }
原题在简化版问题的基础上,增加了基数部分(可选),用字符’e’或者’E’表示,基数部分之后只能连接整数,在之前的代码上做修改。
1 public boolean isNumber(String s){ 2 int i = 0; 3 int len = s.length(); 4 //Whitespace 5 while(i < len && Character.isWhitespace(s.charAt(i))){ 6 i++; 7 } 8 //'+' or '-' 9 if(i < len && (s.charAt(i) == '+' || s.charAt(i) == '-')){ 10 i++; 11 } 12 //digit before '.' 13 boolean isNumeric = false; 14 while(i < len && Character.isDigit(s.charAt(i))){ 15 i++; 16 isNumeric = true; 17 } 18 //'.' 19 if(i < len && s.charAt(i) == '.'){ 20 i++; 21 } 22 //digit after '.' 23 while(i < len && Character.isDigit(s.charAt(i))){ 24 i++; 25 isNumeric = true; 26 } 27 if(isNumeric && i < len && (s.charAt(i) == 'e' || s.charAt(i) == 'E')){ 28 i++; 29 isNumeric = false; 30 if(i < len && (s.charAt(i) == '+' || s.charAt(i) == '-')){ 31 i++; 32 }while(i < len && Character.isDigit(s.charAt(i))){ 33 i++; 34 isNumeric = true; 35 } 36 } 37 //Whitespace 38 while(i < len && Character.isWhitespace(s.charAt(i))){ 39 i++; 40 } 41 return isNumeric && i == len; 42 }
方法二: 利用自动机
可参考 http://blog.csdn.net/kenden23/article/details/18696083
方法三:正则表达式
可参考 http://blog.csdn.net/fightforyourdream/article/details/12900751

浙公网安备 33010602011771号