65. 有效数字

65. 有效数字

给定一个字符串 s ,返回 s 是否是一个 有效数字

例如,下面的都是有效数字:"2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789",而接下来的不是:"abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"

一般的,一个 有效数字 可以用以下的规则之一定义:

  1. 一个 整数 后面跟着一个 可选指数
  2. 一个 十进制数 后面跟着一个 可选指数

一个 整数 定义为一个 可选符号 '-''+' 后面跟着 数字

一个 十进制数 定义为一个 可选符号 '-''+' 后面跟着下述规则:

  1. 数字 后跟着一个 小数点 .
  2. 数字 后跟着一个 小数点 . 再跟着 数位
  3. 一个 小数点 . 后跟着 数位

指数 定义为指数符号 'e''E',后面跟着一个 整数

数字 定义为一个或多个数位。

示例 1:

**输入:**s = “0”

**输出:**true

示例 2:

**输入:**s = “e”

**输出:**false

1、模拟

class Solution {
public:
    bool isNumber(string s) {
        // 去除前后空格
        int l = 0, r = s.size()-1;
        while(l <= r && s[l] == ' ') l++;
        while(l <= r && s[r] == ' ') r--;
        if(l > r) return false;  // 空字符串
        
        s = s.substr(l, r-l+1);  // 截取有效部分
        if(s[0] == '+' || s[0] == '-') s = s.substr(1);  // 跳过符号位
        if(s.empty() || (s[0] == '.' && (s.size() == 1 || s[1]=='e' || s[1]=='E'))) 
            return false;  // 排除纯符号或无效点开头
        
        int dot = 0, e = 0;  // 记录点和e的出现次数
        for(int i=0; i<s.size(); i++) {
            if(s[i] == '.') {
                if(dot++ > 0 || e > 0) return false;  // 多个点或点在e后
            } else if(s[i]=='e' || s[i]=='E') {
                if(e++ > 0 || i == 0 || i == s.size()-1) return false;  // 多个e或首尾位置
                if(s[i+1]=='+' || s[i+1]=='-') {  // 跳过e后的符号
                    if(++i == s.size()-1) return false;  // 符号后必须有数字
                }
            } else if(s[i] < '0' || s[i] > '9') {  // 非法字符
                return false;
            }
        }
        return true;
    }
};
  • 时间:n
  • 空间:1

你可能感兴趣的:(LeetCode每日一题,算法,数据结构,leetcode)