1. 程式人生 > >leetcode65- Valid Number- hard

leetcode65- Valid Number- hard

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