您的位置:首页 > 其它

Leetcode -- Valid Number

2015-01-30 15:40 232 查看
https://oj.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.

public boolean isNumber(String s)

这题本质是一个简易的有限状态机。需要对合理数有一定的了解。基本上除了合理的0~9和不合理的其他字符外,还有三类特殊字符需要处理:1. 小数点。 2. 正负号。3.科学记数法的e/E。

下面就给出几个必须满足的特殊条件:

1.当出现小数点的时候,e, 'E' 和小数点不能出现过(一个数字小数点只能出现一次,科学记数法后面也没有可能出现小数点);前一位或者后一位必须是数字(记住是或者,因为可以存在.2e1或者1.e1这种情况)。

2.出现正负号的时候, a. 必须是第一位或者科学记数法e符号之后的一位。 b. 后一位必须是数字或者小数点。

3.当出现科学记数法e/E符号的时候: a.只能出现一次。 b. 不能使第一位或者最后一次。

根据以上出现的条件,加上对非法字符的判断。我们可以给出代码如下: public boolean isNumber(String s) {
boolean eAppeared = false;//因为这个只能出现一次
boolean dotAppeared = false;// 同上
s = s.trim();//在题目里前后的空格并不影响合法性。
if(s.length() == 0)
return false;
for(int i = 0; i < s.length(); i++){
switch(s.charAt(i)){
case 'e':
case 'E':
if(i == 0 || i == s.length() - 1 || eAppeared)//e不能是第一位或者最后一位,也不能出现第二次。
return false;
eAppeared = true;
break;
case '+':
case '-':
if(!(i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E') || !(i != s.length() - 1 && (s.charAt(i + 1) <= '9' && s.charAt(i + 1) >= '0' || s.charAt(i + 1) == '.')))
return false;//正负号必须是第一位或者e之后的一位,并且后一位必须是数字或者小数点
break;
case '.':
if(eAppeared || dotAppeared || !((i != 0 && s.charAt(i - 1) >= '0' && s.charAt(i - 1) <= '9') || (i != s.length() - 1 && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9')))
return false;//e,E,小数点不能出现过,前一位或者后一位必须是数字。
dotAppeared = true;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
return false;
}
}
return true;
}这题的难度并不在于算法的复杂度,在于的是状态的复杂度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: