# 有效数字

<p><strong>有效数字</strong>（按顺序）可以分成以下几个部分：</p><ol>	<li>一个 <strong>小数</strong> 或者 <strong>整数</strong></li>	<li>（可选）一个 <code>'e'</code> 或 <code>'E'</code> ，后面跟着一个 <strong>整数</strong></li></ol><p><strong>小数</strong>（按顺序）可以分成以下几个部分：</p><ol>	<li>（可选）一个符号字符（<code>'+'</code> 或 <code>'-'</code>）</li>	<li>下述格式之一：	<ol>		<li>至少一位数字，后面跟着一个点 <code>'.'</code></li>		<li>至少一位数字，后面跟着一个点 <code>'.'</code> ，后面再跟着至少一位数字</li>		<li>一个点 <code>'.'</code> ，后面跟着至少一位数字</li>	</ol>	</li></ol><p><strong>整数</strong>（按顺序）可以分成以下几个部分：</p><ol>	<li>（可选）一个符号字符（<code>'+'</code> 或 <code>'-'</code>）</li>	<li>至少一位数字</li></ol><p>部分有效数字列举如下：</p><ul>	<li><code>["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]</code></li></ul><p>部分无效数字列举如下：</p><ul>	<li><code>["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]</code></li></ul><p>给你一个字符串 <code>s</code> ，如果 <code>s</code> 是一个 <strong>有效数字</strong> ，请返回 <code>true</code> 。</p><p> </p><p><strong>示例 1：</strong></p><pre><strong>输入：</strong>s = "0"<strong><br />输出：</strong>true</pre><p><strong>示例 2：</strong></p><pre><strong>输入：</strong>s = "e"<strong><br />输出：</strong>false</pre><p><strong>示例 3：</strong></p><pre><strong>输入：</strong>s = "."<strong><br />输出：</strong>false</pre><p><strong>示例 4：</strong></p><pre><strong>输入：</strong>s = ".1"<strong><br />输出：</strong>true</pre><p> </p><p><strong>提示：</strong></p><ul>	<li><code>1 <= s.length <= 20</code></li>	<li><code>s</code> 仅含英文字母（大写和小写），数字（<code>0-9</code>），加号 <code>'+'</code> ，减号 <code>'-'</code> ，或者点 <code>'.'</code> 。</li></ul>

以下程序实现了这一功能，请你填补空白处内容：

```java
class Solution {
	char[] chars;
	boolean point = false;
	boolean exponent = false;
	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 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;
	}
}
```

## template

```java
class Solution {
	char[] chars;
	boolean point = false;
	boolean exponent = false;
	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;
	}
}
```

## 答案

```java
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;
}
```

## 选项

### A

```java
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 true;
		}
	}
	return false;
}
```

### B

```java
public boolean pre(int i, int length) {
	if (i >= length) {
		return false;
	}
	if (chars[i] == '+' || chars[i] == '-') {
		i++;
	}
	if (i == length && !point) {
		return true;
	}
	for (; i < length; i++) {
		if (chars[i] < '0' || chars[i] > '9') {
			return true;
		}
	}
	return false;
}
```

### C

```java
public boolean pre(int i, int length) {
	if (i >= length) {
		return false;
	}
	if (chars[i] == '+' || chars[i] == '-') {
		i++;
	}
	if (i == length && !point) {
		return true;
	}
	for (; i < length; i++) {
		if (chars[i] < '0' || chars[i] > '9') {
			return false;
		}
	}
	return true;
}
```