leetcode:65. 有效数字

该篇博客主要介绍了如何使用模拟方法解决LeetCode上的一个问题,即验证一个字符串是否代表一个有效的数字。博客详细解析了题目的要求,并提供了C++代码实现,包括检查整数和浮点数的有效性的辅助函数。通过字符串分割和遍历,确保了加减号、小数点及数字的正确位置,同时处理了'e'或'E'表示指数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源

题目描述

在这里插入图片描述
在这里插入图片描述

题目解析

模拟

字符串大模拟,根据「有效数字定义」梳理规则即可。

本题有多种解法:「正则」、「DFA」、「模拟」…

「模拟」是在各类场景中最容易实现的方式

将字符串以 e/E 进行分割后,其实规则十分简单:

  • 如果存在 e/E :左侧可以「整数」或「浮点数」,右侧必须是「整数」
  • 如果不存在 e/E :整段可以是「整数」或「浮点数」

关键在于如何实现一个 check 函数用于判断「整数」或「浮点数」:

  • +/- 只能出现在头部
  • . 最多出现一次
  • 至少存在一个数字
class Solution {
    bool check(string &s, int left, int right, bool mustInteger){
        if(left > right){
            return false;
        }

        if(s[left] == '+' || s[left] == '-'){
            ++left;
        }

        bool hasDot = false, hasNum = false;
        for (int i = left; i <= right; ++i) {
            if(s[i] == '.'){
                if(mustInteger || hasDot){
                    return false;
                }
                hasDot = true;
            }else if(isdigit(s[i])){
                hasNum = true;
            }else{
                return false;
            }
        }

        return hasNum;
    }
public:
    bool isNumber(string s) {
        // 是否存在e, 记录e存在的位置
        bool has_e = false;
        int idx = -1;
        int n = s.size();

        for (int i = 0; i < n; ++i) {
            if (s[i] == 'e' || s[i] == 'E'){
                if(idx == -1){
                    idx = i;
                }else{
                    return false;
                }
            }
        }

        if(idx == -1){ // 不存在e,E
            return check(s, 0, n - 1, false);
        }else{
            return check(s, 0, idx -1, false) && check(s, idx + 1, n - 1, true);
        }
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值