[Leetcode]Valid Number
来源:互联网 发布:淘宝服务器有几台 编辑:程序博客网 时间:2024/05/16 19:04
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.
This is really a trivial question, a lot of corner cases need to be found, just like the Stirng to Integer question.
首先要明确所有可能的计数法,对于一般科学计数法和普通的计数法,能够出现的字符无非是'+', '-', '0-9', '.', 'e'
有几点很重要:
1. 数中间不能有空格
2. 正负号可以出现在数得最前端也可以出现在e之后的最前端,两部分中正负号都只能出现一次. 正负号不影响后续符号的行为
3.小数点只能出现一次,并且不能出现在e后面,并且必须要有数字存在,不能单独一个小数点。小数点出现后会影响到后续正负号,小数点后不能再出现正负号了
4. e一开始不能出现,必须在前面有数字(小数点和正负号不行)的情况下才能出现。e出现了一次以后就不能再出现了。e出现之后,会开放后续放置小数点和正负号的权限,但是由于e前后都需要数字,e出现后的hasNum标记要变为false,因为相当于后半部分又没有数字了。
5. 数字一开始标记为无,出现数字后,其会影响e的放置权限,如果出现数字并且没有e存在的情况下,那么e的放置权限开放。放入数字后就不能再出现正负号。
6. 其他一切字符出现都是false。
几种很难考虑的corner case
'.': false
'+.8e1': true
'+.8e1.1': false
'e': false
public boolean isNumber(String s) {if (s==null ){ return false; } // trim off head and tail zeros which not affect result depend on question s=s.trim(); if(s.length()==0){ return false; } boolean hasNum=false; boolean canSign=true; boolean canDot=true; boolean canE=false;//At first we cannot put e until there is a number or other things boolean hasE=false; int i=0; while(i<s.length()){ char c=s.charAt(i++); if (c==' '){ //中间可能有空格 return false; } if (c=='+' ||c=='-'){ //当正负号第一次进入的时候,并且在e之前,正负号只对自身有影响,出现了以后在e出现之前就不能再出现了 if (!canSign){ return false; } canSign=false; continue; } if (c=='.'){ if (!canDot){ return false; } canDot=false;//有点之后就不能再有小数点了 canSign=false;//有点之后在e出现之前都不能再有正负号了 continue; } if (c=='e'){ if (!canE||hasE){//When e comes, we already have e or we cannot put e, we return false return false; } canE=false;//e出现之后,我们就不能再放置e了,换言之e只允许出现一次 hasE=true;//顾名思义变成true hasNum=false;//出现e之后,之前有的是否有数字的信息清零,hasNum变false canDot=false;//出现e之后,再也不能出现点了,所以canDot变为false canSign=true;//出现e之后,之前是否有正负号信息清零,canSign变成true,e之后可以出现正负号 continue; } if (c>='0' && c<='9'){ hasNum=true;//有数字读入 //只有当有数字读入之后我们才能考虑开放e的放置权限 if (!hasE){//当放入一个数之后,如果我们处于不能放e并且现在也没有e的状态,则意味着下一个可能会放入的e将会是第一个e,所以设置canE = true表示可以放入下一个可能的e canE=true; } canSign=false;//放入数字后就不能再放入符号了 } else{ return false; } } return hasNum; }
0 0
- LeetCode: Valid Number
- LeetCode : Valid Number
- Leetcode: Valid Number
- [Leetcode] Valid Number
- leetcode 50: Valid Number
- [LeetCode] Valid Number
- 【leetcode】Valid Number
- [LeetCode]Valid Number
- [leetcode] Valid Number
- LeetCode | Valid Number
- LeetCode-Valid Number - 有限状态机
- leetcode Valid Number
- Leetcode: Valid Number
- 【leetcode】Valid Number
- Leetcode Valid Number
- LeetCode题解: Valid Number
- LeetCode Valid Number
- [Leetcode] Valid Number (Java)
- 有一个人、在我心里
- 用得真心,换的孑然心境
- 感谢对手
- 长春办理信用卡的微博_腾讯微博
- Android平台下的JNI开发
- [Leetcode]Valid Number
- View Barbara Canellis's Obituary
- Using Trade Shows to Launch or License Your Novel Consumer Product Is Key
- The ghosts of World War I still haunt us
- sql server 2008 评估期已过期解决办法
- 我们都是龙的传人
- Crytek的幕后花絮
- ubuntu 14.04安装gnome3桌面
- Python正则表达式指南