3种解法 - 判断字符串是有效数字

本文介绍了三种判断字符串是否为有效数字的方法:规则判断、有限状态机和分类判断。规则判断通过检查每个字符及其出现规则;有限状态机利用状态变迁表进行判断;分类判断则针对整数、小数和指数进行单独分析。每种方法的时间复杂度和空间复杂度均为O(n)和O(1)。
摘要由CSDN通过智能技术生成


目录

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

例如:

“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”
正/负号 - “+”/"-"
小数点 - “.”
当然,在输入中,这些字符的上下文也很重要。


解法一(规则判断)

思路:对字符串的每个字符进行检测,保证每个字符满足要求,并且满足其出现的基本规则,规则如下:

  1. 正负号,仅能出现在开头位置(整个字符串开头,或者科学表示法的指数部分开头)
  2. 小数点,仅能出现一次,且不能出现在科学表示法的指数部分
  3. e,科学表示法仅能出现一次,且前后都要有数值
  4. 数值,需要以数值进行结尾
  5. 其它任意符号,都是异常字符
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
public class Solution {
   
    public bool IsNumber(string s) {
   
        s = s.Trim();
        char t;
        bool eFlag = false,pFlag = false,numberFlag = false;
        bool startFlag = true;
        for(int i=0;i<s.Length;i++)
        {
   
            t = s[i];
            if(t >= '0' && t <= '9')
            {
   //数字标识
                numberFlag = true;
            }
            else if(t == '+' || t == '-')
            {
   //符号仅能出现在开头位置
                if(!startFlag)
                {
   
                    return false;
                }
                numberFlag = false;
            }
            else if(t == '.')
            {
   
                if(pFlag || eFlag)
                {
   //小数点仅能出现一次,且不能出现在e后面
                    return false;
                }
                eFlag = true;
            }
            else if(t == 'e')
            {
   
                if(!numberFlag || pFlag)
                {
   //e前面一定要有数值,且仅能出现一次
                    return false;
                }
                pFlag =
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放羊郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值