题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'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;}
}