Leetcode -- Valid Number

https://oj.leetcode.com/problems/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.


public boolean isNumber(String s)


这题本质是一个简易的有限状态机。需要对合理数有一定的了解。基本上除了合理的0~9和不合理的其他字符外,还有三类特殊字符需要处理:1. 小数点。 2. 正负号。3.科学记数法的e/E。

下面就给出几个必须满足的特殊条件:

1.当出现小数点的时候,e, 'E' 和小数点不能出现过(一个数字小数点只能出现一次,科学记数法后面也没有可能出现小数点);前一位或者后一位必须是数字(记住是或者,因为可以存在.2e1或者1.e1这种情况)。

2.出现正负号的时候, a. 必须是第一位或者科学记数法e符号之后的一位。 b. 后一位必须是数字或者小数点。

3.当出现科学记数法e/E符号的时候: a.只能出现一次。 b. 不能使第一位或者最后一次。

根据以上出现的条件,加上对非法字符的判断。我们可以给出代码如下:

    public boolean isNumber(String s) {
        boolean eAppeared = false;//因为这个只能出现一次
        boolean dotAppeared = false;// 同上
        s = s.trim();//在题目里前后的空格并不影响合法性。
        if(s.length() == 0)
            return false;
        for(int i = 0; i < s.length(); i++){
            switch(s.charAt(i)){
                case 'e':
                case 'E':
                    if(i == 0 || i == s.length() - 1 || eAppeared)//e不能是第一位或者最后一位,也不能出现第二次。
                        return false;
                    eAppeared = true;
                    break;
                case '+':
                case '-':
                    if(!(i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E') || !(i != s.length() - 1 && (s.charAt(i + 1) <= '9' && s.charAt(i + 1) >= '0' || s.charAt(i + 1) == '.')))
                        return false;//正负号必须是第一位或者e之后的一位,并且后一位必须是数字或者小数点
                    break;
                case '.':
                    if(eAppeared || dotAppeared || !((i != 0 && s.charAt(i - 1) >= '0' && s.charAt(i - 1) <= '9') || (i != s.length() - 1 && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9')))
                        return false;//e,E,小数点不能出现过,前一位或者后一位必须是数字。
                    dotAppeared = true;
                    break;
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                    break;
                default:
                    return false;
            }
        }
        return true;
    }
这题的难度并不在于算法的复杂度,在于的是状态的复杂度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值