思路
需要考虑一些cases,以下例来编写该题的算法:+2.5e+5。首先用trim将两端的空格去掉,遇到+/-时单独判断;在判断2.5这种浮点数的时候,只需要统计是.和数字的部分,即sc[1]~sc[3],统计.和数字的个数,小数点只能有一个,数字个数需要大于0,不符合条件的可以直接返回false。然后判断e,后面需要接内容,不能以e结束,所以在这里判断一次:i == len。在最后只需要判断i是否等于len即可:i == len为true,否则为false。
【小技巧:为了防止在以上每次判断的时候由于i++而可能导致下一次判断的数组越界,在一开始的时候在sc数组后面加一个空格即可】
复杂度
时间复杂度O(n), 空间复杂度O(n)
代码
public class Solution {
/**
* @param s: the string that represents a number
* @return: whether the string is a valid number
*/
public boolean isNumber(String s) {
// write your code here
if(s == null || s.length() == 0) {
return false;
}
// " " is to avoid array index out of bound.
s = s.trim() + " ";
char[] sc = s.toCharArray();
int len = sc.length - 1;
int i = 0;
if(sc[i] == '+' || sc[i] == '-') {
i++;
}
int num_point = 0, num_digit = 0;
while(Character.isDigit(sc[i]) || sc[i] == '.') {
if(Character.isDigit(sc[i])) {
num_digit++;
} else {
num_point++;
}
i++;
}
if(num_point > 1 || num_digit < 1) return false;
if(sc[i] == 'e') {
i++;
if(sc[i] == '+' || sc[i] == '-') {
i++;
}
if(i == len) return false;
while(i < len) {
if(!Character.isDigit(sc[i])) return false;
i++;
}
}
return (i == len);
}
}