1. 题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
2. 思路
(1)跳过前面的空格部分,开始遍历;
(2)判断是否包含整数部分;
(3)判断是否包含小数部分,如果有小数,小数两边只要有一边为数字即可;
(4)判断是否包含指数部分,如果有指数,指数两边必须为都为数字,且指数右边可以为负数;
(5)跳过后面的空格部分;
(6)到了这一步已经结束了,要判断索引是否到达字符串的最后一个,如果索引为字符串的长度,则该字符串为数值,否则不是。
3. 代码分析
class Solution {
int index = 0;//当前索引
public boolean isNumber(String s) {
char[] chars = s.toCharArray();
int len = chars.length;
//空字符串
if(len==0 || s==null){
return false;
}
//跳过空格部分
while (index<len && chars[index]==' ')
index++;
boolean isNum = false;
//是否包含整数部分
isNum = isInt(chars);
//是否包含小数部分
if(index<len && chars[index]=='.'){
index++;
//小数两边只要一边有数字即可
isNum = isUnsignedInt(chars) || isNum;
}
//是否存在指数部分
if(index<chars.length && (chars[index]=='E' || chars[index]=='e')){
index++;
//指数两边必须为都为数字,且指数右边可以为负数
isNum = isInt(chars) && isNum;
}
//跳过结尾空格部分
while (index<len && chars[index]==' ')
index++;
//到了这一步已经结束了,要判断索引是否到达字符串的最后一个,不是的话会返回false
return isNum && (index==len);
}
//是否为整数
public boolean isInt(char[] chars){
//是否存在符号
if(index<chars.length && (chars[index]=='+'||chars[index]=='-'))
index++;
return isUnsignedInt(chars);
}
//是否为数字
public boolean isUnsignedInt(char[] chars){
int temp = index;
while(index<chars.length && chars[index]>='0' && chars[index]<='9')
index++;
return index>temp;
}
}