题目
有效数字(按顺序)可以分成以下几个部分:
一个 小数 或者 整数
(可选)一个'e'
或 'E'
,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+'
或'-'
)
下述格式之一:
至少一位数字,后面跟着一个点'.'
至少一位数字,后面跟着一个点'.'
,后面再跟着至少一位数字
一个点'.'
,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+'
或 '-'
)
至少一位数字
部分有效数字列举如下:
部分无效数字列举如下:
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
示例 1:
示例 2:
示例 3:
示例 4:
提示:
分析
代码实现
public class Solution {
char[] chars;
boolean point = false;
boolean exponent = false;
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.isNumber(".1"));
}
public boolean isNumber(String s) {
s = s.trim();
int length = s.length();
if (length == 0) {
return false;
}
chars = s.toCharArray();
String[] ss = s.split("e");
if (ss.length == 0) {
return false;
}
if (ss[0].length() == 0)
return false;
if (ss[0].length() < length)
exponent = true;
if (ss[0].length() == length - 1) {
return false;
}
String[] pre = ss[0].split("\\.");
if (pre.length == 0) {
return false;
}
if (pre[0].length() < ss[0].length())
point = true;
boolean result = pre(0, pre[0].length());
result = result && middle(pre[0].length() + 1, ss[0].length());
if (exponent) {
result = result && is(ss[0].length() + 1, length);
}
return result;
}
public boolean pre(int i, int length) {
if (i >= length) {
return true;
}
if (chars[i] == '+' || chars[i] == '-') {
i++;
}
if (i == length && !point) {
return false;
}
for (; i < length; i++) {
if (chars[i] < '0' || chars[i] > '9') {
return false;
}
}
return true;
}
public boolean middle(int i, int length) {
if (i >= length && point) {
if (chars[i - 2] >= '0' && chars[i - 2] <= '9') {
return true;
}
return false;
}
for (; i < length; i++) {
if (chars[i] < '0' || chars[i] > '9') {
return false;
}
}
return true;
}
public boolean is(int i, int length) {
if (i == 1) {
return false;
}
if (chars[i] == '+' || chars[i] == '-') {
i++;
}
if (i == length) {
return false;
}
for (; i < length; i++) {
if (chars[i] < '0' || chars[i] > '9') {
return false;
}
}
return true;
}
}