今天,我“又”做的一道题,要是面试中遇到,铁定要跪。为啥?因为这完全是一道没有算法的题目嘛,考细心,考细节,考各种层出不穷的情况的处理。下面来看看这个题。
Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
首先来看这里数的定义,数可以为正负小数,整数,整数有科学计数表示。
(1)最前面可以出现"+","-", " . "。
这里"+","-"后面还可以出现 " . ",但是不管是哪一个, 后面必须还有整数,这里想想处理没有整数的情况!
(2)接下来部分可能出现 “ . ” ,“e”,数字(严格来书,还有"+","-")。
如果出现“e”,则需判断“e”是否在中间,而不是最后一位。“e”后面可以出现"+"和"-",如果出现,确保后面还有整数。
(3)" . "可以出现在数的任何位置,前面,中间,最后面。它的前后是什么没有限制,可以想象一下。比如0.8, .54, .e10,
class Solution {
public:
bool isNumber(const char *s) {
if(s==NULL) return false;
int i,j;
int dot=0;
int len=strlen(s);
//find the start
for(i=0;i<len;i++) if(s[i]!=' ') break;
if(i==len) return false;
//find the end
for(j=len-1;j>=0;j--) if(s[j]!=' ') break;
//the new len
if(j==i && !isNum(s[i])) return false;
//首位只能为 +, -, .,数字这四种情况
if(s[i]=='+' || s[i]=='-' || isNum(s[i]) || s[i]=='.'){
if(s[i]=='+' || s[i]=='-'){
if(!isNum(s[i+1]) && s[i+1]!='.') return false; //下一位非数字,非点的情况
if(s[i+1]=='.'){ i++; if(i==j) return false; }
}
if(s[i]=='.'){
if(i<j&&!isNum(s[i+1]) || i==j) return false; //如果是点,那么后面必须还得有数字
dot++;
}
//处理剩下部分
for(++i;i<=j;i++){
//中间可能出现的字符有数字、点、e
if(s[i]=='.' &&!dot || s[i]=='e' || isNum(s[i])){
if(s[i]=='e'){ //e只能中间出现
if(i==j) return false;
if(i<j&&(s[i+1]=='+'||s[i+1]=='-')){
i++;
if(i==j) return false;
}
for(++i;i<=j;i++)
if(!isNum(s[i])) return false;
return true;
}
if(s[i]=='.') dot++;
}
else return false;
}
return true;
}
return false;
}
bool isNum(char c){
return c<='9'&&c>='0';
}
};
最后还忘记说了,有空格,能确定的事先做了,比如前后的空格,先全部处理掉。
刚看了discuss部分的,整个人都不好了,看看人家写的几行python代码
def isNumber(self, s):
try:
float(s)
return True
except:
return False
再补一点,话说这样的题目,用正则表达式不就更简单了!?