題目
?
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。
數值(按順序)可以分成以下幾個部分:
- 若干空格
- 一個?小數?或者?整數
- (可選)一個?
'e'
?或?'E'
?,后面跟著一個?整數 - 若干空格
小數(按順序)可以分成以下幾個部分:
- (可選)一個符號字符(
'+'
?或?'-'
) - 下述格式之一:
- 至少一位數字,后面跟著一個點?
'.'
- 至少一位數字,后面跟著一個點?
'.'
?,后面再跟著至少一位數字 - 一個點?
'.'
?,后面跟著至少一位數字
- 至少一位數字,后面跟著一個點?
整數(按順序)可以分成以下幾個部分:
- (可選)一個符號字符(
'+'
?或?'-'
) - 至少一位數字
部分數值列舉如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非數值列舉如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
輸入:s = "0"
輸出:true
示例 2:
輸入:s = "e"
輸出:false
示例 3:
輸入:s = "."
輸出:false
示例 4:
輸入:s = "????.1??"
輸出:true
提示:
1 <= s.length <= 20
s
?僅含英文字母(大寫和小寫),數字(0-9
),加號?'+'
?,減號?'-'
?,空格?' '
?或者點?'.'
?。
解題思路
1.題目要求我們判斷字符串是否表示數值,對于這種題我們需要進行分類討論來對每一種情況進行判斷。
2.首先我們判斷一下字符串 s 是否為空,若為空就返回 false。然后因為空格是合法的,但是它會影響我們的判斷,所以我們需要去除空格,用trim()函數,再將去除后的元素放入字符數組res中,方便我們進行判斷。
3.之后我們用for循環進行遍歷,逐一列舉可能的情況并進行判斷,大家可以結合流程圖和代碼進行理解。
?
?
?
代碼實現
class Solution {public boolean isNumber(String s) {if(s == null || s.length() == 0){return false;}char[] res = s.trim().toCharArray();if(res.length <= 0){return false;} int n = res.length;boolean is_dot = false;boolean is_num = false;boolean is_E_or_e = false;for(int i = 0; i < n; i++){//當前元素為數字時if(res[i] >= '0' && res[i] <= '9' ){is_num = true;//當前元素為.時}else if(res[i] == '.'){//前面不能有.和e/Eif(is_dot || is_E_or_e){return false;}is_dot = true;//當前元素為e/E時}else if(res[i] =='e' || res[i] == 'E'){//前面必須有一個數字,前面不能出現e/Eif(!is_num || is_E_or_e){return false;}is_E_or_e = true;is_num = false; //防止發送11E的這種情況,所以要將is_num重置//當前元素為'-''+'時}else if(res[i] == '+' || res[i] == '-'){if(i != 0 && res[i-1] != 'e' && res[i-1] != 'E'){return false;}//不是以上的五種字符}else{return false;}}return is_num;}
}