题目描述:
给定一个字符串 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 <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 + ,减号 - ,或者点 . 。
思路:
模式匹配,需要细心点,不然容易WA,写出三种数字判断函数,从e||E做拆分,带入函数得出结果
代码:
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| class Solution { public boolean isInteger(String s, int l, int r) { char ch = s.charAt(l++); if (ch != '-' && ch != '+' && (ch < '0' || ch > '9')) { return false; } int numCnt = 0; if (ch >= '0' && ch <= '9') { numCnt++; } while (l <= r) { char item = s.charAt(l++); if (item < '0' || item > '9') { return false; } numCnt++; } return numCnt != 0; }
public boolean isDecimal(String s, int l, int r) { char ch = s.charAt(l++); if (ch != '-' && ch != '+' && ch != '.' && (ch < '0' || ch > '9')) { return false; } int pointCnt = 0, numCnt = 0; if (ch == '.') { pointCnt++; } if (ch >= '0' && ch <= '9') { numCnt++; } if (l > r) { return false; } while (l <= r) { char item = s.charAt(l++); if (item == '.') { if (pointCnt == 1) return false; else pointCnt++; continue; } if (item == 'e' || item == 'E') { return numCnt != 0 && isIndex(s, l - 1, r); } if (item < '0' || item > '9') { return false; } else { numCnt++; } } return numCnt != 0; }
public boolean isIndex(String s, int l, int r) { char ch = s.charAt(l++); if (ch != 'e' && ch != 'E') { return false; } if (l > r) { return false; } return isInteger(s, l, r); }
public boolean isNumber(String s) { int r = s.length() - 1; int e = Math.max(s.indexOf('e'), s.indexOf('E')); if (e == -1) { return isInteger(s, 0, r) || isDecimal(s, 0, r); } else { boolean index = isIndex(s, e, r); return (isInteger(s, 0, e - 1) || isDecimal(s, 0, e - 1)) && index; } } }
|