有效数字
题目描述:
有效数字(按顺序)可以分成以下几个部分:
- 一个小数或者整数
- (可选)一个 'e' 或 'E' ,后面跟着一个整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 下述格式之一:
- 至少一位数字,后面跟着一个点 '.'
- 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
- 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
class Solution {
public boolean isNumber(String s) {
int sign = 0;
int point = 0;
// 初步过滤:过滤掉只剩最多一个正负符号或者最多一个小数点
for(int i = 0 ; i<s.length() ; i++){
if(s.charAt(i) == '+' || s.charAt(i) == '-') sign ++;
else if(s.charAt(i) == '.') point ++;
if(sign > 2 || point > 1) return false;
}
s = s.toLowerCase();
String[] nums = s.split("e");
if(nums.length > 2) return false;
if(s.charAt(s.length() - 1) == 'e') return false;
else if(nums.length == 1){
return isFloat(nums[0]) | isInteger(nums[0]);
}else if(nums.length == 2){
if(!nums[0].equals("")) return (isFloat(nums[0]) | isInteger(nums[0])) & isInteger(nums[1]);
else return false;
}else{
return false;
}
}
private boolean isFloat(String s){
if(s.length() == 1){
if(s.charAt(0) == '-' || s.charAt(0) == '+'){
return false;
}
}
if(s.length() == 2){
if((s.charAt(0) == '-' || s.charAt(0) == '+') && s.charAt(1) == '.'){
return false;
}
}
if(s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1,s.length());
for(int i = 0 ; i<s.length() ; i++){
if(i == 0 && s.charAt(i) == '.' && ( i == s.length()-1 || s.charAt(i+1) > '9' || s.charAt(i+1) < '0' )) return false;
if(i == s.length() - 1 && s.charAt(i) == '.' && ( i == 0 || s.charAt(i-1) > '9' || s.charAt(i-1) < '0' )) return false;
if((s.charAt(i) == '.') && (i-1 >= 0 && (s.charAt(i-1)<'0' || s.charAt(i-1)>'9')
|| i+1 < s.length() && (s.charAt(i+1)<'0' || s.charAt(i+1)>'9')))
return false;
if(s.charAt(i) != '.' && (s.charAt(i) > '9' || s.charAt(i) < '0')) return false;
}
return true;
}
private boolean isInteger(String s){
if(s.length() == 1){
if(s.charAt(0) == '-' || s.charAt(0) == '+'){
return false;
}
}
if(s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1,s.length());
for(int i = 0 ; i<s.length() ; i++){
if(s.charAt(i)<'0' || s.charAt(i)>'9') return false;
}
return true;
}
}
该题核心为两个判断方法,第一个为判断是否为小数,另一个为判断是否为整数,然后按照题意逻辑构建规则即可,详细请看代码。