您的位置:首页 > 其它

Leetcode中判断数字

2014-04-20 16:27 232 查看
今天,我“又”做的一道题,要是面试中遇到,铁定要跪。为啥?因为这完全是一道没有算法的题目嘛,考细心,考细节,考各种层出不穷的情况的处理。下面来看看这个题。

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

再补一点,话说这样的题目,用正则表达式不就更简单了!?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: