leetcode Valid Number

 

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.

 

I think it's hard to finish such a problem during the interview because the conditions are not complete. This problem is just a kidding. 

 

class Solution {
 public:
  bool isNumber(const char *s) {
    // Note: The Solution object is instantiated only once and is reused by each test case.
    bool isSpaceExist = false;
    
    bool isDotExist = false;
    bool isSignExist[2] = {false, false};
    bool iseExist = false;
    bool isePartExist[2]= {false, false};
    while (*s) {
      if (*s == '+' || *s == '-') {
        if (!iseExist) {
          if (isePartExist[0] || isSignExist[0] || isDotExist || isSpaceExist)
            return false;
          else 
            isSignExist[0] = true;
        }
        else {
          if (isePartExist[1] || isSignExist[1] || isSpaceExist)
            return false;
          else 
            isSignExist[1] = true;          
        }
      }
      else if (*s >= '0' && *s <= '9'){
        if (isSpaceExist)
          return false;
        else {
          if (!iseExist)
            isePartExist[0] = true;
          else
            isePartExist[1] = true;
        }
      }
      else if (*s == ' ') {
        if ((isePartExist[0] == false) && (isSignExist[0] || isDotExist))
          return false;
        else if (isePartExist[0])
          isSpaceExist = true;
      }
      else if (*s == 'e' || *s == 'E') {
        if (!isePartExist[0] || iseExist || isSpaceExist)
          return false;
        else 
          iseExist = true;
      }
      else if (*s == '.') {
        if (isDotExist || iseExist || isSpaceExist)
          return false;
        else
          isDotExist = true;
      }
      else
        return false;
      s++;
    }
    if (iseExist && !isePartExist[1])
      return false;
    if (!isePartExist[0])
      return false;
    return true;
  }
};

有限状态机实现,以下转载自:https://blog.youkuaiyun.com/kenden23/article/details/18696083

class Solution {
public:
	bool isNumber(const char *s) {
		enum InputType {
			INVALID,		// 0 Include: Alphas, '(', '&' ans so on
			SPACE,		// 1
			SIGN,		// 2 '+','-'
			DIGIT,		// 3 numbers
			DOT,			// 4 '.'
			EXPONENT,		// 5 'e' 'E'
		};
		int transTable[][6] = {
		//0INVA,1SPA,2SIG,3DI,4DO,5E
			-1,  0,  3,  1,  2, -1,//0初始无输入或者只有space的状态
			-1,  8, -1,  1,  4,  5,//1输入了数字之后的状态
			-1, -1, -1,  4, -1, -1,//2前面无数字,只输入了Dot的状态
			-1, -1, -1,  1,  2, -1,//3输入了符号状态
			-1,  8, -1,  4, -1,  5,//4前面有数字和有dot的状态
			-1, -1,  6,  7, -1, -1,//5'e' or 'E'输入后的状态
			-1, -1, -1,  7, -1, -1,//6输入e之后输入Sign的状态
			-1,  8, -1,  7, -1, -1,//7输入e后输入数字的状态
			-1,  8, -1, -1, -1, -1,//8前面有有效数输入之后,输入space的状态
		};
		int state = 0;
		while (*s)
		{
			InputType input = INVALID;
			if (*s == ' ') input = SPACE;
			else if (*s == '+' || *s == '-') input = SIGN;
			else if (isdigit(*s)) input = DIGIT;
			else if (*s == '.') input = DOT;
			else if (*s == 'e' || *s == 'E') input = EXPONENT;
			state = transTable[state][input];
			if (state == -1) return false;
			++s;
		}
		return state == 1 || state == 4 || state == 7 || state == 8;
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值