思考过程:
首先要确定的是,什么样的字符串可以表示数字
1.全是由0-9组成的字符串 比如 234
2.在1的中间,加上一个小数点 比如 2.34
3.2+e(或者E)+1(带正负号的1) 比如 2.34e-23
4.在1,2,3的前面,加上正负号 比如 -2.34e-23
然后判断字符串是否满足上述条件。
代码实现:
public boolean isNumber(String s) {
s = s.trim();
if (s.length() < 1) {
return false;
}
//把可能的'E'转成'e'
s = s.toLowerCase();
//去掉头部的正负号
if (s.startsWith("+") || s.startsWith("-")) {
s = s.substring(1);
}
int dot = -1;//出现小数点的位置
int e = -1;//出现e的位置
int minus = -1;//出现-的位置
int plus = -1;//出现+的位置
boolean haveDig = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//记录下是否有数字
if (Character.isDigit(c)) {
haveDig = true;
}
//如果出现正号,判断e是否在正号前一位,不是就返回false
//然后判断正号是否出现过,如果出现过,返回false
//判断是否在尾部,如果是,返回false
else if (c == '+') {
if (e == -1 || i - 1 != e) {
return false;
}
if (plus != -1) {
return false;
}
if (i == s.length() - 1) {
return false;
}
plus = i;
}
//如果出现负号,判断e是否在负号前一位,不是就返回false
//然后判断负号是否出现过,如果出现过,返回false
//判断是否在尾部,如果是,返回false
else if (c == '-') {
if (e == -1 || i - 1 != e) {
return false;
}
if (minus != -1) {
return false;
}
if (i == s.length() - 1) {
return false;
}
minus = i;
}
//如果出现e,判断在e之前,是否有数字,如果没有,返回false
// 然后判断当前位置是否是尾部,如果是,返回false
// 然后判断是否出现过,如果已经出现过e,返回false,否则记录下位置
else if (c == 'e') {
if (!haveDig) {
return false;
}
if (i == s.length() - 1) {
return false;
}
if (e != -1) {
return false;
}
e = i;
}
//如果出现小数点,判断是否在e之后,如果是,返回false
// 然后判断是否出现过,出现过返回false
//否则记录下当前位置
else if (c == '.') {
if (e != -1) {
return false;
}
if (dot != -1) {
return false;
}
dot = i;
} else {
return false;
}
}
return haveDig;
}
执行结果:
虽然是通过了,但是这种解法,需要考虑所有情况,稍有遗漏都不行,所以就出现了如图的情况,一直在提交代码,然后根据反馈的测试用例,再来修改代码,再提交。感觉不是太好
算法复杂度分析:
时间复杂度O(n)
空间复杂度O(1)