標籤:leetcode java 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.
題意:
驗證給定的字串是否表示一個數。
一些例子:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
注意: 問題的描述不是特別的明確,在實現演算法之前,你需要收集所有的要求。
演算法分析:
當時第一遍刷leetcode的時候,這個題是通過率最低的一道。AC之後才發現,不是演算法本事特別的複雜,是測試的範例各種各樣,想不到啊。不提交都沒法調試。演算法不
複雜,只要你把所有的情況都能想到就行。真是為了AC而AC。
這當然不是搞演算法的人應有的態度(囧)。正確的套路好像是先分析問題,再解決問題哦。
參考http://pisxw.com/algorithm/Valid-Number.html
基本規則是按照科學計數法,所以會出現的特殊字元有以下幾個:符號位‘+’,‘-’,小數點‘.’,還有‘e’和‘E’,剩下的就只有數字0-9了,其他字元如果出現就是非法字元,返回false。數字字元在哪裡出現都是ok的,我們主要考慮幾個特殊字元的情況。
對於小數點出現的時候,我們要滿足一下這些條件:
1. 前面不能有小數點或者‘e’和‘E’;
2. 前一位是數字(不能是第一位)或者後一位要是數字(不能是最後一位)。
對於加號或減號出現的情況,要滿足條件:
1. 必須是第一位或者在‘e’和‘E’後一位;
2. 後一位要是數字。
對於‘e’和‘E’的情況,要滿足:
1. 前面不能有‘e’和‘E’出現過;
2. 不能是第一位(前面沒數字科學計數沒有意義)或者最後一位(後面沒數字就不用寫指數了)。
AC代碼:
public class Solution { public boolean isNumber(String s) { if(s==null) return false; s = s.trim(); if(s.length()==0) return false; boolean dotFlag = false; boolean eFlag = false; for(int i=0;i<s.length();i++) { switch(s.charAt(i)) { case '.': if(dotFlag || eFlag || ((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; dotFlag = 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)>='0'&&s.charAt(i+1)<='9'||s.charAt(i+1)=='.'))) return false; break; case 'e': case 'E': if(eFlag || i==s.length()-1 || i==0) return false; eFlag = 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; }}
這裡也把自己第一遍AC的代碼貼出來吧,全當是記錄了
public class Solution { public boolean isNumber(String s) {int dotnum=0;int expnum=0;int signnum=0;String tems="";String nosigns="";s=s.trim(); if(s==null||s.length()==0)return false;for(int i=0;i<s.length();i++){if(s.charAt(i)>='0'&&s.charAt(i)<='9'){continue;}else if(s.charAt(i)=='-'&&i==0||s.charAt(i)=='+'&&i==0){signnum++;if(signnum>1)return false;nosigns=s.substring(1);s= new String(nosigns);i=-1;}else if(s.charAt(i)=='e'){expnum++;if(expnum>1)return false;if(i-1>=0&&i+1<=s.length()-1){ if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'&&s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'||s.charAt(i-1)=='.'||(s.charAt(i+1)=='-'&&i+1!=s.length()-1)||(s.charAt(i+1)=='+'&&i+1!=s.length()-1)){if(s.charAt(i+1)=='+'||s.charAt(i+1)=='-')i++;if(!s.substring(i).contains("."))continue;else return false;} elsereturn false;}elsereturn false;}else if(s.charAt(i)=='.'){dotnum++;if(dotnum>1)return false;if(i-1>=0||i+1<=s.length()-1){if(i-1>=0){if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')continue;else return false;}if(i+1<=s.length()){if(s.charAt(i+1)=='e'){if(i-1>=0){if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')continue;else return false;}elsereturn false;}else if(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9')continue;else return false;}}elsereturn false;}elsereturn false;}return true; }}
著作權聲明:本文為博主原創文章,轉載註明出處
[LeetCode][Java] Valid Number