65. 有效数字

news2024/12/26 23:48:55

题目链接:力扣

 解题思路:从前往后挨个进行有效判断,注意其中e或E和小数点只能出现一次,具体算法如下:

  1. 初始变量:
    1. i =0:遍历指针
    2. dot=false:标记小数点是否已经出现
    3. E = false:标记E是否已经出现
  2. 如果首个字符是符号,则去掉符号位,令i++
  3. 遍历字符串s:
    1. 如果当前字符是小数点:
      1. 如果小数点已经出现过了,返回false,否则令dot=true
      2. 如果e或者E已经出现了,返回false,因为e或E后面只能为整数
      3. 如果小数点后面没有数字,则小数点前面必须有一个数字,否则返回false(小数格式1的要求
      4. 如果小数点前面有数字:
        1. 如果小数点后面是e或E或0-9或者空,continue(小数格式2和3的要求
      5. 如果小数点前面没有数字,则小数点后面必须是0-9,也就是小数点后面不能是e或E或空,(因为小数要么以数字开头,要么小数点开头后面加数字),否则返回false(有效数字组成部分1和2的要求
    2. 否则,如果当前字符是e或E:
      1. 如果e或E已经出现过了或则e后面没有数字,返回false(有效数字组成部分2的要求
      2. e或E前面必须有一个整数或者小数,所以e前面必须为一个数字或者小数点,否则返回false
      3. e或E后面的整数可以带符号,也可以不带符号
        1. 如果带符号,符号后面没有数字了,返回false
        2. 如果符号后面有数字,令i++,消耗掉这个符号
    3. 否则,如果不是数字,直接返回false

AC代码:

class Solution {
    public static boolean isNumber(String s) {
        int i = 0;
        //去掉刚开始的符号位
        if (s.charAt(i) == '+' || s.charAt(i) == '-') {
            i++;
            if (s.length() == 1) {
                return false;
            }
        }
        //标记 '.' 是否出现,点只能出现一次
        boolean dot = false;
        //标记E或e是否出现,也只能出现一次
        boolean E = false;
        for (; i < s.length(); i++) {
            if (s.charAt(i) == '.' && !dot) {//如果是 '.',并且 '.' 还没出现过
                dot = true;
                if (E) {//因为e后面只能是整数,当在e后面出现 '.' 直接返回false
                    return false;
                }

                //如果小数点后面没有数字,则小数点前面必须有一个数字,否则返回false
                if (i + 1 >= s.length() && (i - 1 < 0 || s.charAt(i - 1) < '0' || s.charAt(i - 1) > '9')) {
                    return false;
                }

                //小数点前面有数字
                if (i - 1 >= 0 && s.charAt(i - 1) >= '0' && s.charAt(i - 1) <= '9') {
                    //小数点后面可以是 e或E或 0-9或""
                    if (i + 1 >= s.length() || s.charAt(i + 1) == 'e' || s.charAt(i + 1) == 'E' || s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
                        continue;
                    }
                }
                //小数点前面没有数字,则小数点后面必须是0~9之间的一个数,否则返回false
                if (i + 1 >= s.length() || s.charAt(i + 1) < '0' || s.charAt(i + 1) > '9') {
                    return false;
                }
            } else if (s.charAt(i) == '.' && dot) {//小数点只能出现一次,再次出现返回false,不过不加这个判断也能通过测试
                return false;
            } else if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {//当前字符是e或E
                //E或e已经出现了,或者e后面没有整数,返回false
                if (E || i + 1 >= s.length()) {
                    return false;
                }
                E = true;

                //e前面必须有整数或者小数,所以e前面必须为一个数字或者是小数点 否则返回false
                //因为已经做过判断的前面的字符只会包含+,-,0-9和小数点,所以只需要排除+或者-就可以了
                if (i - 1 < 0 || s.charAt(i - 1) == '+' || s.charAt(i - 1) == '-') {
                    return false;
                }

                //e后面的整数可以带符号,也可以不带符号,如果带符号,直接跳过符号位
                if ((s.charAt(i + 1) == '+' || s.charAt(i + 1) == '-')) {
                    if (i + 2 >= s.length()) {//符号位后面没有数字了,返回false
                        return false;
                    }
                    i++;//跳过符号位
                }
            } else if (s.charAt(i) > '9' || s.charAt(i) < '0') {//不是数字,直接返回false
                return false;
            }
        }
        return true;
    }
}

 解法二:正则表达式

AC代码:

class Solution {
    public static boolean isNumber(String s) {
        return s.matches("^[+-]?((\\d+)|(\\d+\\.\\d*)|(\\d*\\.\\d+))([eE][+-]?\\d+)?$");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以智慧监测模式守护燃气安全 ,汉威科技“传感芯”凸显智慧力

城市燃气工程作为城市基建的重要组成部分&#xff0c;与城市居民生活、工业生产紧密相关。提升城市燃气服务质量和安全水平&#xff0c;也一直是政府和民众关注的大事。然而&#xff0c;近年来居民住宅、餐饮等工商业场所燃气事故频发&#xff0c;时刻敲响的警钟也折射出我国在…

浅浅了解下单例模式中的懒汉模式饿汉模式

单例模式 1.什么是设计模式2.什么是单例模式3.常见实现单例模式的两种方式1.饿汉模式(1)特点(2)代码实现(3)线程是否安全 2.懒汉模式(1)特点(2)代码实现(3)线程是否安全(4)如何保证线程安全解决方案:进阶方案 3.对比懒汉模式和饿汉模式1、线程安全2、是否延迟加载3、系统开销4、…

QMainWindow

文章目录 QMainWindow基本元素QMainWindow函数介绍简单的示例效果图 QMainWindow QMainWindow是一个为用户提供主窗口程序 的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、―个 状态栏(status bar )及一个中心部件(central …

【算法提高:动态规划】1.2 最长上升子序列模型(TODO最长公共上升子序列)

文章目录 题目列表1017. 怪盗基德的滑翔翼1014. 登山482. 合唱队形1012. 友好城市&#xff08;⭐排序后 最长上升子序列模型&#xff09;1016. 最大上升子序列和1010. 拦截导弹解法1——最长递减子序列 贪心解法2——最长递减子序列 最长递增子序列&#xff08;⭐贪心结论&am…

K8s集群部署-详细步骤

不够详细&#xff0c;后面有时间再编辑 安装 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭swap, selinux swapoff -a && sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab setenforce 0 && sed -i s/^SELINUX.*/SELINUXdisabled/ /…

Safari 查看 http 请求

文章目录 1、开启 Safari 开发菜单2、显示 JavaScript 控制台 1、开启 Safari 开发菜单 Safari 设置中&#xff0c;打开开发菜单选项 *** 选择完成后&#xff0c;Safari 的目录栏就会出现一个 开发 功能。 2、显示 JavaScript 控制台 开启页面后&#xff0c;在开发中选中 显…

Android 之 动画合集之补间动画

本节引言&#xff1a; 本节带来的是Android三种动画中的第二种——补间动画(Tween)&#xff0c;和前面学的帧动画不同&#xff0c;帧动画 是通过连续播放图片来模拟动画效果&#xff0c;而补间动画开发者只需指定动画开始&#xff0c;以及动画结束"关键帧"&#xff0…

提示计算机丢失MSVCP140.dll怎么办?这三个修复方法可解决

最近在使用电脑的过程中&#xff0c;遇到了一个问题&#xff0c;即缺少了MSVCP140.dll文件。这个文件是一个动态链接库文件&#xff0c;常用于Windows操作系统中的应用程序中。由于缺少这个文件&#xff0c;会导致计算机系统无法运行某些软件或游戏。丢失MSVCP140.dll可能是由于…

【技术分享】oracle数据库相关操作

-- 截断表 TRUNCATE TABLE TABLE_NAME;-- 删除表 DROP TABLE TABLE_NAME;-- 查询表 SELECT * FROM TABLE_NAME;-- 添加一条记录 INSERT INTO TABLE_NAME(COLUMN) VALUES(VALUE);-- 删除记录 DELETE FROM TABLE_NAME WHERE COLUMNVALUE;-- 修改记录 UPDATE TABLE_NAME SET…

Android性能优化之Thread native层源码分析(InternalError/Out of memory)

近期处理Bugly上OOM问题&#xff0c;很多发生在Thread创建启动过程&#xff0c;虽然最后分析出是32位4G虚拟内存不足导致&#xff0c;但还是分析下Java层Thread 源码过程&#xff0c;可能会抛出的异常InternalError/Out of memory。 Thread报错堆栈&#xff1a; Java线程创建…

数据库|手把手教你成为 TiDB 的 Contributor

一、背景 最近笔者在 AskTUG 回答问题的时候发现&#xff0c;在 6.5.0 版本出现了几个显示未启动必要组件 NgMonitoring 的问题贴。经过排查发现&#xff0c;是 ngmonitoring.toml 中的配置文件出现了问题。文件中的 endpoints 应该是以逗号分隔的&#xff0c;但是却写成了以空…

JavaWeb 项目实现(二) 注销功能

3.注销功能 接前篇&#xff0c;实现了登录功能之后&#xff0c;现在实现注销功能。 因为我们实现登录就是在Session中记录了用户信息。 所以注销功能&#xff0c;就是在Session中移除用户信息。 代码&#xff1a;删除Session中的用户信息&#xff0c;跳转登录页面 package…

【安全渗透】第一次作业(编码知识总结)

目录 1. ASCII编码 2、Unicode 3、UTF-8 1. ASCII编码 ASCII 是“American Standard Code for Information Interchange”的缩写&#xff0c;翻译过来是“美国信息交换标准代码”。ASCII 的标准版本于 1967 年第一次发布&#xff0c;最后一次更新则是在 1986 年&#xff0c…

QEMU源码全解析13 —— QOM介绍(2)

接前一篇文章&#xff1a;QEMU源码全解析12 —— QOM介绍&#xff08;1&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 本回开始对QOM…

django学习笔记(1)

django创建项目 先创建一个文件夹用来放django的项目&#xff0c;我这里是My_Django_it 之后打开到该文件下&#xff0c;并用下面的指令来创建myDjango1项目 D:\>cd My_Django_itD:\My_Django_it>"D:\zzu_it\Django_learn\Scripts\django-admin.exe" startpr…

记录每日LeetCode 2500.删除每行中的最大值 Java实现

题目描述&#xff1a; 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其中任何一个。 将删除元素中的最大值与答案相加。 …

Reinforcement Learning with Code 【Chapter 7. Temporal-Difference Learning】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

Linux内核与内核空间是什么关系呢?

对内核空间的认识清晰了许多。要理解用户空间与内核空间需要有如下的几个认识&#xff1a; 内核的认识&#xff1a;从2个不同的角度来理解&#xff0c;一个是静态的角度&#xff0c;如“芦中人”所比喻&#xff0c;内核可以看做是一个lib库&#xff0c;内核对外提供的API打包…

快速远程桌面控制公司电脑远程办公

文章目录 快速远程桌面控制公司电脑远程办公**第一步****第二步****第三步** 快速远程桌面控制公司电脑远程办公 远程办公的概念很早就被提出来&#xff0c;但似乎并没有多少项目普及落实到实际应用层面&#xff0c;至少在前几年&#xff0c;远程办公距离我们仍然很遥远。但20…

1分钟上手Apifox

1、客户端右上角账号设置-生成令牌 2、IDEA下载插件 Apifox Helper 3、 配置ApiFoxHelper 令牌 4、在controller类界面右键 5、输入项目id 6、项目ID从客户端 项目设置-项目ID获取 7、导入成功 8、右键刷新查看导入的接口 9、自动生成数据&#xff08;某postman还要自己手输&a…