[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

posted @ 2016-08-17 10:35  沫沫_fun  阅读(122)  评论(0)    收藏  举报