【题20数值表示的字符串】
【题目】
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)
例如:
字符串“+100”,“5e2”,“-123”,“3.1416”及“-1E-16”都表示数值
但是“12e”,“1a3.14”,“1.2.3”,“±5”及“12e5.4”都不是。
分析:
表示数值的字符串模式:A[.[B]][e|EC]或者.B[e|EC]
- 如果一个数没有整数部分,它的小数部分不能为空
- A和C都是可能以‘+’或‘-’开头的0~9的数位串。
- B也是0~9的数位串,但前面不能有正负号
eg.
‘123.45e+6’ 中
- 123 是整数部分A
- 45是小数部分B
- +6是指数部分C
判断一个字符串是否符合上述模式时,
(1) 尽可能多地扫描0~9的数位(有可能起始处有+或-)即前面模式中表示数值整数的A部分
(2) 如果遇到‘.’,则开始扫描表示数值的小数B部分
(3) 如果遇到‘e’或者‘E’,则开始扫描表示数值指数C部分。
实现
/**
* 表示数值的字符串
* 数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是整数(可以有正负号也可以没有),而B是一个无符号整数
*/
public class NumberString {
int index;
public boolean isNumber(char[] str){
if(str == null || str.length == 0){
return false;
}
index = 0;
boolean flag = scanInteger(str);
//判断小数部分
if(index < str.length && str[index] == '.'){
index++;
flag = scanUnsignedInteger(str) || flag;
}
//判断指数部分
if(index < str.length && (str[index] == 'e' || str[index] == 'E')){
index++;
flag = scanInteger(str) && flag;
}
return index >= str.length && flag;
}
//扫描整数部分
public boolean scanInteger(char[] str){
if(index < str.length && (str[index] == '+' || str[index] == '-')){
index++;
}
return scanUnsignedInteger(str);
}
//扫描无符号整数部分
public boolean scanUnsignedInteger(char[] str){
int temp = index;
while(index < str.length && str[index] >= '0' && str[index] <= '9'){
index++;
}
return index > temp;
}
public static void main(String[] args) {
NumberString test = new NumberString();
String str = "12e+5.4";
boolean result = test.isNumber(str.toCharArray());
System.out.println(result);
}
}
参考:
1.《剑指offer》
2. https://blog.csdn.net/weixin_37672169/article/details/80164483