LeetCode 65 - Valid Number

作者 QIFAN 日期 2017-03-07
LeetCode 65 - Valid Number

原题链接: 65. Valid Number


题干

给定一个字符串,如果是一个数字,返回 true ,否则返回 false

思路

这题考察的是在题意“数字”定义比较模糊的情况下做题。所以先想几个 corner case 。

“ 0 “ true 开头结尾可以有空格
“1. 3” false 中间不能有空格
“0xa” false 六进制不行
“2e10” true 科学计数法
“2.3e1.2” false 科学计数法形式不能是小数
“-2e-10” true 科学计数法可以用负数
“0.2e10” true
“-.2e10” true
“-2.3” true 负数
“2222222222222222222222222222222” true 数字范围没有限制

几个遗漏的 case:
“3.” true
“+3” true 正负符号都可以有

总结一下:
数字可以概括为这样一个形式 “浮点或整型 + [e + 整型]” 。e + 整型 是可选部分,但一定一起出现。

所以我的方式是先用 “e” 分词,如果有分出来了,就按照科学计数法来处理,也就是含有两个数字,第一个可浮点可整型,第二个为整型。

如果分出来的数组长度多于 2 ,那是不符合的。

如果分出来的长度为 1 ,那说明是一个整型或者浮点。

代码:

public boolean isNumber(String s) {
s = s.trim();
if (s.length() == 0 || s.endsWith("e")) {
return false;
}
String[] parts = s.split("e");
if (parts.length == 0 || parts.length > 2) {
return false;
}
if (parts.length == 1) {
return isNum(s);
}
return isNum(parts[0]) && isInt(parts[1]);
}
private boolean isInt(String s) {
return s.matches("[-\\+]?[0-9]+");
}
private boolean isNum(String s) {
return isInt(s) || s.matches("[-\\+]?([0-9]+)?[\\.]([0-9]+)") || s.matches("[-\\+]?([0-9]+)[\\.]([0-9]+)?");
}