[LeetCode]65. 有效数字

题目

验证给定的字符串是否可以解释为十进制数字。

例如:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3 " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false

说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:

  • 数字 0-9
  • 指数 - “e”
  • 正/负号 - “+”/"-"
  • 小数点 - “.”

当然,在输入中,这些字符的上下文也很重要。

解题思路

详细思路请参考 剑指 Offer 20. 表示数值的字符串

代码

class Solution {
    public boolean isNumber(String s) {
        // 去除首尾空格
        String str = s.trim();
        int n = str.length();
        if(n == 0){
            return false;
        }
        boolean flag = false;
        // 一、扫描整数部分
        int i = 0;
        int a = 0;
        if(str.charAt(i) == '+' || str.charAt(i) == '-'){
            i++;
        }
        a = i;
        while(a<n && str.charAt(a)>='0' && str.charAt(a)<='9'){
            a++;
        }
        // 判断整数部分是否存在
        flag = a>i;
        // 二、扫描小数部分
        int j = a;
        int b = a;
        if(j<n && str.charAt(j)=='.'){
            j++;
            b = j;
            while(b<n && str.charAt(b)>='0' && str.charAt(b)<='9'){
                b++;
            }
            // 整数部分或者小数部分至少存在一个
            flag = flag || (b>j);
        }
        // 扫描指数部分
        int k = b;
        int c = b;
        if(k<n && str.charAt(k)=='e'){
            k++;
            while(k<n && (str.charAt(k) == '+' || str.charAt(k) == '-')){
                k++;
            }
            c = k;
            while(c<n && str.charAt(c)>='0' && str.charAt(c)<='9'){
                c++;
            }
            flag = flag && (c>k);
        }
        return flag && (c==n);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章