20 表示数值的字符串

博客探讨了如何判断一个字符串是否表示数值,通过常规解法和确定有限状态自动机来实现。文章详细阐述了解决思路,包括字符串处理、状态转移和错误条件检查。最后提到了《剑指offer》中的Java版本实现,强调了时间和空间复杂度。
摘要由CSDN通过智能技术生成

20 表示数值的字符串

在这里插入图片描述

常规解法

在遍历的过程中如果不满足字符串表示数值的条件就返回false,遍历结束之后若没有返回false,且字符串中包含数字,就返回true。其实就是列举出所有false的情况,只有中间过程没有出现false才有可能返回true。

首先定义了四个flag对应四种字符:
是否有数字:hasNum
是否有e:hasE
是否有小数点:hasDot
是否有正负号:hasSign

这道题目还要考虑字符串首尾出现的空格,在开始遍历之前先处理空格

开始遍历。
判断数字使用一个while循环。如果是数字 hasNum置为 true,index++,继续往下遍历如果到了字符串结尾,或者不是数字了就出判断是否是数字的循环。

如果到了字符串结尾,就跳出整个循环,等待后续处理。

如果不是字符串结尾,继续判断字符c的情况:
如果c是e或者E:如果以前出现过e或者E(hasE == true)返回false;如果e或者E的前面没有数字,返回false。否则 其他三个flag置false,hasE置true。

如果c是+或者-:如果以前出现过+或者-,返回flase(这里若是在e之后出现+或-是合理的,但是因为如果出现了e那么hasSign已经置false了,所以不会符合这个条件);如果以前出现过数字,返回false;如果以前出现过小数点,返回false;否则,hasSign置true,继续。

如果c是小数点:如果以前出现过小数点,返回false;如果以前出现过e,返回false(e之后不能是小数,指数必须是整数);否则,hasDot置true;

如果c是空格:break,出循环,经历后续处理。

循环最后index++。

出循环之后,继续处理空格。
然后如果hasNum是true,也就是说有数字,且到了字符串的结尾了,就返回true。

class Solution {
   
    public boolean isNumber(String s) {
   
        boolean hasNum = false;
        boolean hasE = false;
        boolean hasSign = false;
        boolean hasDot = false;

        int len = s.length();
        int index=0;

        //处理空格
        while(index<len && s.charAt(index)==' '){
   
            index++;
        }

        while(index<len){
   
            

            while(index<len && s.charAt(index)>='0' && s.charAt(index)<='9'){
   
                hasNum = true;
                index++;
                
            }
            if(index == len){
   
                    break;
            }

            char c = s.charAt(index);
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值