描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

示例一:

输入:
"123.45e+6"
返回值:
true

示例二:

输入:
"1.2.3"
返回值:
false

题目简述

        给定一个字符串判断它是否为表示数值。

算法一: 分治 (C++)

        时间复杂度:O(N)

        思路:

            1. 对于数字来说:必须存在数字。
            2. 对于 ' . ' 来说:  (1) : 只能出现一次。
                                        (2) : 不能在 e / E 的后面。
            3. 对于e、E来说: (1) : 只能出现一次。
                                        (2) :  前面一位 和 后面一位或者两位 必须是数字。
            4. 对于 ' + ' 、' - '  来说:   只能出现在 首位 或者 e/E的后面一位。

代码:


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return bool布尔型
     */
    bool digit(char ch){ //判断是否是数字
        if(ch>='0'&&ch<='9') return true;
        return false;
    }
    bool isNumeric(string str) {
        // write code here
        int exp=0;//是否出现过E、e
        int dot=0;//是否出现过 '.'
        int sym=0;//是否出现过 +、-
        int dig=0;//是否出现过数字
        int len=str.size();
        for(int i=0;i<len;i++){
            if(str[i]=='.'){
                if(dot||exp) return false;
                dot=1;
            }
            else if(str[i]=='e'||str[i]=='E'){
                if(exp||!(digit(str[i-1])&&(digit(str[i+1])||digit(str[i+2])))) return false;
                exp=1;
            }
            else if(str[i]>='0'&&str[i]<='9'){
                dig=1;
                continue;
            }
            else if(str[i]=='+'||str[i]=='-'){
                if(i!=0&&!(str[i-1]=='e'||str[i-1]=='E')) return false;
            }
            else return false;
        }
        return dig;
    }
};


算法二:

        时间复杂度:O(N)

        思路:

            直接利用函数将字符串转化为数字,若是异常说明该字符串不能表示数字,则进行异常处理,返回false即可。

代码:


import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return bool布尔型
     */
    public boolean isNumeric (String str) {
        // write code here
        try{
            Double res=Double.parseDouble(str);
            return true;
        }catch(Exception e){
            return false;
        }
    }
}