题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'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/E
if(is_dot || is_E_or_e){
return false;
}
is_dot = true;
//当前元素为e/E时
}else if(res[i] =='e' || res[i] == 'E'){
//前面必须有一个数字,前面不能出现e/E
if(!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;
}
}