题目

描述

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

解题思路

1. 暴力匹配模式 时间复杂度为O(n),空间复杂度O(n)

  1. 列出条件
    1 .不能出现多次,且不能出现在 e/E 后
    2 e/E只能出现一次或者不出现,并且出现之前前面必须有数字
    3 不能出现除了数字以及.+-eE之外的任符号
package JZ53;

class Solution {
    public boolean isNumeric(String s) {
        if (s == null || s.trim().equals("")) {
            return false;
        }
        boolean numberCheck = false;
        boolean sign = false;
        boolean eCheck = false;
        char[] numberArr = s.trim().toCharArray();
        for (int i = 0; i < numberArr.length; i++) {
            if (numberArr[i] >= '0' && numberArr[i] <= '9') {
                numberCheck = true;
            } else if (numberArr[i] == '.') {
                // 小数点不能出现多次,只能出现0次或者不出现,而且必须出现在e或者E前面
                if (!sign && !eCheck) {
                    sign = true;
                } else {
                    return false;
                }
            } else if (numberArr[i] == 'e' || numberArr[i] == 'E') {
                // e/E 只能出现0次或者1次,并且出如果出现前面必须已经出现过数字
                if (!eCheck && numberCheck) {
                    eCheck = true;
                    numberCheck = false;
                } else {
                    return false;
                }
            } else if (numberArr[i] != '+' && numberArr[i] != '-') {
                //不能出现除了数字以及.+-eE之外的任符号
                return false;
            } else {
                // e/E 只能出现在 0 位置或 e/E 后一个位置
                if (i > 0 && numberArr[i - 1] != 'e' && numberArr[i - 1] != 'E') {
                    return false;
                }
            }
        }
        return numberCheck;
    }
}

2. 正则表达式

  1. ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
  2. *匹配前面的子表达式零次或多次
  3. +匹配前面的子表达式一次或多次
  4. .匹配除换行符 \n 之外的任何单字符.
  5. [\d] 匹配数字字符
  6. [0-9] 匹配0~9中任意的数字
  7. ^ 匹配字符串头部位置
  8. $ 匹配字符串尾部位置
     public boolean isNumeric(String s) {
         //判断s是否为null以及长度是否为0,并且s必须是包含数字的
         if (s == null || s.length() == 0 || !s.matches(".*\\d.*")) {
             return false;
         }
         // 去除字符串后的空格
         s = s.trim();
         // 如果s包含了e或者E
         if (s.contains("e") || s.contains("E")) {
             // 当e没有数字的时候
             if (s.matches("[^\\d]*[e|E].*")) {
                 return false;
             }
             return (s.matches("^[\\+-]?\\d*\\.?\\d*[e|E][\\+-]?\\d+$"));
         } else {
             //如果s不存在e以及E
             return s.matches("^[\\+-]?(\\d*\\.?)\\d*$");
         }
     }