65. 有效数字
题目描述
给定一个字符串 s ,返回 s 是否是一个 有效数字。
例如,下面的都是有效数字:"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"。
一般的,一个 有效数字 可以用以下的规则之一定义:
- 一个 整数 后面跟着一个 可选指数。
 - 一个 十进制数 后面跟着一个 可选指数。
 
一个 整数 定义为一个 可选符号 '-' 或 '+' 后面跟着 数字。
一个 十进制数 定义为一个 可选符号 '-' 或 '+' 后面跟着下述规则:
- 数字 后跟着一个 小数点 
.。 - 数字 后跟着一个 小数点 
.再跟着 数位。 - 一个 小数点 
.后跟着 数位。 
指数 定义为指数符号 'e' 或 'E',后面跟着一个 整数。
数字 定义为一个或多个数位。
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
提示:
1 <= s.length <= 20s仅含英文字母(大写和小写),数字(0-9),加号'+',减号'-',或者点'.'。
解法
方法一:分情况讨论
首先,我们判断字符串是否以正负号开头,如果是,将指针 \(i\) 向后移动一位。如果此时指针 \(i\) 已经到达字符串末尾,说明字符串只有一个正负号,返回 false。
如果当前指针 \(i\) 指向的字符是小数点,并且小数点后面没有数字,或者小数点后是一个 e 或 E,返回 false。
接着,我们用两个变量 \(dot\) 和 \(e\) 分别记录小数点和 e 或 E 的个数。
用指针 \(j\) 指向当前字符:
- 如果当前字符是小数点,并且此前出现过小数点或者 
e或E,返回false。否则,我们将 \(dot\) 加一; - 如果当前字符是 
e或E,并且此前出现过e或E,或者当前字符是开头或结尾,返回false。否则,我们将 \(e\) 加一;然后判断下一个字符是否是正负号,如果是,将指针 \(j\) 向后移动一位。如果此时指针 \(j\) 已经到达字符串末尾,返回false; - 如果当前字符不是数字,返回 
false。 
遍历完字符串后,返回 true。
时间复杂度 \(O(n)\),其中 \(n\) 为字符串长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60  |  | 
1 2 3 4 5 6 7 8 9  |  |