首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >剑指Offer(五十三)-- 表示数值的字符串

剑指Offer(五十三)-- 表示数值的字符串

作者头像
秦怀杂货店
发布2022-02-15 14:04:32
发布2022-02-15 14:04:32
4320
举报
文章被收录于专栏:技术杂货店技术杂货店

Github仓库地址:https://github.com/Damaer/CodeSolution 笔记地址:https://damaer.github.io/CodeSolution/ 仓库介绍:刷题仓库:CodeSolution

题目描述

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

示例1

输入

"123.45e+6"

返回值

true

思路以及解答

这道题咋一看,有点复杂,case很多,主要是分析好判断分支,我们可以定义几个变量:

  • hashNum: 是否已经有数字
  • hashE:是否已经有E
  • hasSign:是否已经有符号
  • hasDot:是否已经有小数点

首先,初始化当前的索引index =0,字符串头部的空格需要跳过。

  • 循环判断索引是否在有效的范围内:
    • 循环判断是否是数字,是数字则更新hasNum = true,并且索引后移,直到不是数字的时候,跳出循环。
  • 跳出循环后,需要判断当前的index是否合法,不合法直接break
  • 取出当前索引的字符c
    • 如果前面已经有小数点或者有E出现了,那么就是非法的,返回false
    • 否则hasDot置为true
    • 前面如果已经出现过数字或者符号或者小数点,都不是合法的
    • 否则hasSign置为true,表示符号出现过
    • 如果前面已经出现过E,或者前面没有数字,直接返回false
    • 否则,hasE置为true,其他的置为false,也就是E后面可以继续出现符号数字和小数点了
    • 如果ce或者E
    • 如果c是“+”或者“-”:
    • 如果c是小数点“.
    • 如果c为空格,直接跳出循环
    • 否则,直接返回false
  • 最后也需要跳过空格
  • 最后判断是否合法的条件是:是否到达最后一个字符,并且出现过数字
代码语言:javascript
复制
    public boolean isNumeric(String str) {
        int size = str.length();
        int index= 0 ;
        // 默认全部是false
        boolean hashNum=false ,hasE=false ,hasSign=false ,hasDot=false;
        // 跳过空格
        while(index<size&&str.charAt(index)==' '){
            index++;
        }
        while(index<size){
            while(index<size&&str.charAt(index)>='0'&& str.charAt(index)<='9'){
                index++;
                // 表示前面有数字
                hashNum = true;
            }
            // 到末尾直接跳出
            if(index==size){
                break;
            }
            char c = str.charAt(index);
            if(c=='e'||c=='E'){
                // 前面有E或者没有数字在前面
                if(hasE||!hashNum){
                    return false;
                }
                hasE = true;
                // 出现E了后面又可以出现数字了
                hashNum = false;
                hasSign = false;
                hasDot = false;
            }else if(c=='+'||c=='-'){
                if(hasSign||hashNum||hasDot){
                    return false;
                }
                hasSign = true;
            }else if(c=='.'){
                if(hasDot||hasE){
                    return false;
                }
                hasDot =true;
            }else if(c==' '){
                break;
            }else{
                return false;
            }
            index++;
        }        
        // 跳过空格
        while(index<size&&str.charAt(index)==' '){
            index++;
        }
        return hashNum &&index==size;
    }

总结一下

这道题,其实本质是转态的切换,最最重要的一点,是E出现之后,其实小数点和符号,和数字,都是可以再出现的,可以理解为E就是一个分割线。

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。

平日时间宝贵,只能使用晚上以及周末时间学习写作 - END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秦怀杂货店 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路以及解答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档