Leetcode中判断数字

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

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

再补一点,话说这样的题目,用正则表达式不就更简单了!?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值