1.题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
2.算法分析
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数- 若干空格
小数:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字整数:
(可选)一个符号字符(
'+'
或'-'
)至少一位数字
分析:
①数值,首尾若干空格,那就先去掉空格
②数值,包括小数,整数。
③小数,小数只有一个点,这个点前面有数字,或者点后面有数字
④
'e'
或'E'
,后面跟着一个 整数⑤ ' + ',' - ',不能挨着,只是符号
总结:
① 对每一个字符进行判断,按情况来
②是数值
③是小数点
④e E的判断
3.Java代码实现
class Solution {
public boolean isNumber(String s) {
if(s == null || s.length() == 0){
return false;
}
// 遍历每一个字符,对当前字符进行判断,以及前一个字符以及后一个字符
boolean isNum = false,isDot = false,ise_or_E = false;
char[] str = s.trim().toCharArray();
for(int i = 0;i < str.length;i++){
//判断当前是否是0-9的数位
if(str[i] >= '0' && str[i] <= '9'){
// 是数值
isNum = true;
}else if(str[i] == '.'){
// 如果之前有小数点了,或者E,e,那么返回false
if(isDot || ise_or_E){
return false;
}
// 设置状态
isDot = true;
}else if(str[i] == 'e' || str[i] == 'E'){
if(!isNum || ise_or_E){
return false;
}
ise_or_E = true;
isNum = false;
}else if(str[i] == '-' || str[i] == '+'){
// 看E,e的情况。
if(i!=0 && str[i - 1] != 'e' && str[i - 1] != 'E'){
return false;
}
}else {
return false;
}
}
return isNum;
}
}