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;
}这题的难度并不在于算法的复杂度,在于的是状态的复杂度。
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;
}这题的难度并不在于算法的复杂度,在于的是状态的复杂度。
相关文章推荐
- LeetCode65 Valid Number 解题报告
- leetcode-65-Valid Number
- LeetCode(65) Valid Number
- LeetCode - Valid Number - Frequent
- [LeetCode] Valid Number
- LeetCode: Valid Number
- leetcode ||65、 Valid Number
- [leetcode]Valid Number
- LeetCode 第 65 题(Valid Number)
- Leetcode_65 Valid Number
- LeetCode-Valid Number-合法数字-状态机
- [leetcode]Valid Number
- Leetcode NO.65 Valid Number
- leetcode---Valid Number
- [LeetCode]Valid Number
- LeetCode Online Judge 题目C# 练习 - Valid Number
- LeetCode-Valid Number - 有限状态机
- [LeetCode]Valid Number
- LeetCode——Valid Number
- LeetCode - Valid Number