leetcode65- Valid Number- hard
阿新 • • 發佈:2017-12-01
pub 現在 req 允許 char ima isn color val
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.
幾個要考慮的情況:整數,小數decimal,正號負號,科學計數法。問:1e9 .5, 6.可以嗎(可以)? e可以和小數一起出現嗎 0.5e100 (e前面可以有小數後面不行)
可以允許的符號有:‘0‘~‘9‘ ‘.‘ ‘e‘ ‘+-‘
規則有:
1. 必須有數字出現過,單獨的‘.‘ ‘e‘ ‘+-‘ 都不是數字。所以最後返回numSeen && eSeen
2. ‘.‘ 只可以出現一次,而且不能出現在e後面。
3.‘e‘只可以出現一次,而且前後都必須有數字。
4.‘+-‘ 必須在最前面,或者緊跟在e後面。
5. ‘ ‘ 不能出現在中間,但可以在頭尾。用s = s.trim()解決(這點面試的時候就別講了吧,太刻意了)
實現:
class Solution { //1. ‘.‘ 只可以出現一次,而且不能出現在e後面,而且後面必須有數字。 //2.‘e‘只可以出現一次,而且前後都必須有數字。//3.‘+-‘ 必須在最前面,或者緊跟在e後面。 //4. ‘ ‘ 不能出現在中間,但可以在頭尾。(這點面試的時候就別講了吧,太刻意了) //可以允許的符號有:‘0‘~‘9‘ ‘.‘ ‘e‘ ‘+-‘ public boolean isNumber(String s) { // 要先去掉頭尾的空格 s = s.trim(); boolean numSeen = false; boolean pointSeen = false; boolean eSeen = false; boolean hasNumAfterE = false; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= ‘0‘ && c <= ‘9‘) { numSeen = true; if (eSeen) { hasNumAfterE = true; } } else if (c == ‘.‘) { if (pointSeen || eSeen) { return false; } pointSeen = true; } else if (c == ‘e‘) { if (eSeen || !numSeen) { return false; } eSeen = true; } else if (c == ‘+‘ || c == ‘-‘) { if (i != 0 && s.charAt(i - 1) != ‘e‘) { return false; } } else { return false; } } if (eSeen) { return numSeen && hasNumAfterE; } return numSeen; } }
leetcode65- Valid Number- hard