剑指Offer 20.表示数值的字符串

20.表示数值的字符串

题目

官方地址
在这里插入图片描述

代码(正则表达式)

public boolean isNumeric (String str) {if (str == null || str.length() == 0)return false;return new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
}

在给定的代码中,matches() 方法被用于判断一个字符串是否表示一个数值。下面是对该方法的详细解释:

if (str == null || str.length() == 0):首先,代码检查输入的字符串 str 是否为 null 或者长度为 0。如果是,表示字符串为空,无法进行数值判断,因此返回 false。

new String(str):代码创建了一个新的字符串对象,目的是为了调用 matches() 方法。这里的目的是确保 matches() 方法被调用。

matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?"):该代码使用正则表达式来判断字符串是否匹配数值的模式。

  1. [±]?:表示正负号可选,即可有可无。 \d*:表示 0 个或多个数字。
  2. (\.\d+)?:表示小数部分,其中 \.表示小数点,\d+ 表示一个或多个数字。整个部分可选,表示小数部分可有可无。
  3. ([eE][±]?\d+)?:表示指数部分,其中[eE] 表示指数符号,[±]? 表示正负号可选,\d+ 表示一个或多个数字。整个部分可选,表示指数部分可有可无。

题解

class Solution {private int currentIndex;public boolean isNumber(String s) {s = s.trim();int n = s.length();if (n == 0) {return false;}currentIndex = 0;boolean numeric = scanInteger(s);// 如果出现'.',接下来是数字的小数部分if (currentIndex < n && s.charAt(currentIndex) == '.') {currentIndex++;// 下面一行代码用||的原因:// 1. 小数可以没有整数部分,例如.123等于0.123;// 2. 小数点后面可以没有数字,例如233.等于233.0;// 3. 当然小数点前面和后面可以有数字,例如233.666numeric = scanUsignedInteger(s) || numeric;}// 如果出现'e'或者'E',接下来跟着的是数字的指数部分if (currentIndex < n && (s.charAt(currentIndex) == 'e' || s.charAt(currentIndex) == 'E')) {currentIndex++;// 下面一行代码用&&的原因:// 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;// 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4numeric = scanInteger(s) && numeric;}return currentIndex == n && numeric;}/*** 整数的格式可以用[+|-]B表示, 其中B为无符号整数* @param s* @return*/private boolean scanInteger(String s) {int n = s.length();if (currentIndex < n && (s.charAt(currentIndex) == '+' || s.charAt(currentIndex) == '-')) {currentIndex++;}return scanUsignedInteger(s);}private boolean scanUsignedInteger(String s) {int n = s.length();int beforeIndex = currentIndex;while (currentIndex < n && '0' <= s.charAt(currentIndex) && s.charAt(currentIndex) <= '9') {currentIndex++;}// 当str中存在若干0-9的数字时,返回truereturn currentIndex > beforeIndex;}
}
  1. 首先,将字符串的两端空格去除,并获取字符串的长度 n。如果去除空格后的字符串长度为0,直接返回 false。

  2. 初始化 currentIndex 为0,用于追踪当前扫描的位置。

  3. 调用 scanInteger(s) 方法判断字符串的整数部分。该方法会检查当前位置是否为正号或负号,如果是则将 currentIndex 增加1,并调用 scanUnsignedInteger(s) 方法判断无符号整数部分。

  4. 如果当前位置小于字符串长度且当前字符是小数点(‘.’),则将 currentIndex 增加1,并调用 scanUnsignedInteger(s) 方法判断小数部分。注意,小数部分可以没有整数部分,也可以没有小数点后的数字,因此使用逻辑或(||)将结果与 numeric 进行逻辑运算。

  5. 如果当前位置小于字符串长度且当前字符是指数符号(‘e’ 或 ‘E’),则将 currentIndex 增加1,并调用 scanInteger(s) 方法判断指数部分。指数部分必须包含整数,因此使用逻辑与(&&)将结果与 numeric 进行逻辑运算。

  6. 最后,判断 currentIndex 是否等于字符串长度,并且 numeric 是否为 true。如果满足条件,表示整个字符串可以解释为一个数值,返回 true;否则返回 false。

scanInteger() 方法用于判断整数部分:

获取字符串的长度 n。

如果当前位置小于字符串长度且当前字符是正号或负号(‘+’ 或 ‘-’),则将 currentIndex 增加1。

调用 scanUnsignedInteger(s) 方法判断无符号整数部分。

返回 scanUnsignedInteger(s) 的结果。

scanUnsignedInteger() 方法用于判断无符号整数部分:

获取字符串的长度 n。

初始化 beforeIndex 为 currentIndex 的值。

当 currentIndex 小于字符串长度且当前字符是数字字符(‘0’ 到 ‘9’ 之间的字符)时,将 currentIndex 增加1。

判断 currentIndex 是否大于 beforeIndex。如果大于,表示字符串中存在若干数字字符,返回 true;否则返回 false。

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

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

相关文章

PCIE链路信息

目录 简介&#xff1a; 目的&#xff1a; 详情&#xff1a; 简介&#xff1a; PCIe有很多寄存器&#xff0c;也有很多控制&#xff0c;包括链路状态信息&#xff0c;上一节我们讲到了PCie的链路训练&#xff0c;这节文章将继续学习PCIe相关知识。 目的&#xff1a; 从设计…

【Python从小白到高手】---函数基础

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Python小白从入门到精通】&#x1f388; 本专栏旨在分享学习Python的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录…

iPhone 6透明屏是什么?原理、特点、优势

iPhone 6透明屏是一种特殊的屏幕技术&#xff0c;它能够使手机屏幕变得透明&#xff0c;让用户能够透过屏幕看到手机背后的物体。 这种技术在科幻电影中经常出现&#xff0c;给人一种未来科技的感觉。下面将介绍iPhone 6透明屏的原理、特点以及可能的应用。 iPhone 6透明屏的原…

本地 shell无法连接centos 7 ?

1、首先检查是否安装ssh服务&#xff1b; yum list installed | grep openssh-server# 没有安装尝试安装下 yum install openssh-server 2、检查ssh服务是否开启 systemctl status sshd.service# 未开启&#xff0c;开启下 systemctl start sshd.service # 将sshd 服务添…

socker套接字

1.打印错误信息 2.socketaddr_in结构体 结构体&#xff1a; &#xff08;部分库代码&#xff09; (宏中的##) 3.manual TCP: SOCK_STREAM &#xff1a; 提供有序地&#xff0c;可靠的&#xff0c;全双工的&#xff0c;基于连接的流式服务 UDP: 面向数据报

406 · 和大于S的最小子数组

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a;同向双指针 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param nums: an array …

【maven】构建项目前clean和不clean的区别

其实很简单&#xff0c;但是百度搜了一下&#xff0c;还是没人能简单说明白。 搬用之前做C项目时总结结论&#xff1a; 所以自己在IDE里一遍遍测试程序能否跑通的时候&#xff0c;不需要clean&#xff0c;因为反正还要改嘛。 但是这个项目测试好了&#xff0c;你要打成jar包给…

element-tree-line el-tree 添加结构线 添加虚线

概览&#xff1a;给element组件添加上虚线&#xff0c;通过使用插件element-tree-line 参考连接&#xff1a; 参考别人的博客 安装插件&#xff1a; # npm npm install element-tree-line -S # yarn yarn add element-tree-line -S main.js全局注册引入插件&#xff1a; imp…

Python批量查字典和爬取双语例句

最近&#xff0c;有网友反映&#xff0c;我的批量查字典工具换到其它的网站就不好用了。对此&#xff0c;我想说的是&#xff0c;互联网包罗万象&#xff0c;网站的各种设置也有所不同&#xff0c;并不是所有的在线字典都可以用Python爬取的。事实上&#xff0c;很多网站为了防…

Linux文本三剑客---grep、sed、awk

目录标题 1、grep1.1 命令格式1.2命令功能1.3命令参数1.4grep实战演练 2、sed2.1 认识sed2.2命令格式2.3常用选项options2.4地址定界2.5 编辑命令command2.6用法演示2.6.1常用选项options演示2.6.2地址界定演示2.6.3编辑命令command演示 3、awk3.1认识awk3.2常用命令选项3.3awk…

向表中随机插入字符串数据

已知表 向该表中插入指定次数的随机字符串&#xff1a; 代码如下: DROP PROCEDURE sc //CREATE PROCEDURE sc(num INT) BEGIN DECLARE str VARCHAR(26) DEFAULT "abcdefghijklmnopqrstuvwxyz"; DECLARE cnt INT DEFAULT 0; DECLARE startIndex INT DEFAULT 1; DE…

msvcp120.dll丢失的解决方法(亲测可修复方的法)

在运行某些软件的时候&#xff0c;计算机提示msvcp120.dll丢失&#xff0c;无法打开运行软件。在第一次遇到这个问题的时候&#xff0c;相信很多人都不知道是怎么回事。下面小编把msvcp120.dll是什么以及如何解决这个问题的详细方法给大家科普一下。 问题描述&#xff1a; 在使…

Ubuntu安装MySQL 8.0与Navicat

目录 Ubuntu安装MySQL 8.0 1、更新软件包列表 2、安装 MySQL 8.0 3、启动 MySQL 服务 5、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Ubuntu安装Navicat 1、下载 Navicat 2、额外的软件包 3、执行命令 U…

周末在家值班,解决几个月前遗忘的Bug

问题&#xff1a; 周末被迫在家值班&#xff0c;无聊之际打开尘封已久的Bug清单&#xff0c;发现有Bug拖了几个月还没解决… 场景是这样子的&#xff0c;有个功能是拿Redis缓存热点数据进行展示&#xff0c;暂且称它为功能A&#xff0c;有个另外的功能B&#xff0c;它会去更新缓…

lifecycleScope Unresolved reference

描述 导入了lifecycle.lifecycleScope&#xff0c;但是在activity中使用lifecycleScope报错出现Unresolved reference找不到引用。 导包 import androidx.lifecycle.lifecycleScope使用 lifecycleScope.launch(Dispatchers.IO) {...}错误 方案 代码中的activity继承Activ…

【基于HBase和ElasticSearch构建大数据实时检索项目】

基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据&#xff0c;解决海量数据存储和实时更新查询的问题&#xff1b;利用ElasticSearch作为HBase索引&#xff0c;加快大数据集中实时查询数…

年薪930万,谷歌薪资大揭秘

硅谷大厂中&#xff0c;谷歌员工称得上是科技行业中收入最高的一些人。 据统计&#xff0c;谷歌工程师在2022年总薪酬中位数为279,802美元&#xff08;约200万人民币&#xff09;&#xff0c;但这仅是基本工资。 如果计入股权和奖金&#xff0c;他们的收入甚至更高。 近来&am…

elasticSearch常见的面试题

常见的面试问题 描述使用场景 es集群架构3个节点&#xff0c;根据不同的服务创建不同的索引&#xff0c;根据日期和环境&#xff0c;平均每天递增60*2&#xff0c;大约60Gb的数据。 调优技巧 原文参考&#xff1a;干货 | BAT等一线大厂 Elasticsearch面试题解读 - 掘金 设计阶…

Spring源码分析

一、基本注解 1.注解总览 2.重点注解描述 ① Bean、Import 初学时&#xff0c;一般使用xml配置文件将Bean注册到Spring容器当中&#xff0c;在实际开发中&#xff0c;使用注解将Bean注册到Spring容器当中也是很常见的。 使用xml方式将bean注册到spring容器当中 获取bean信息…

【C语言进阶】数据的存储----浮点型篇

&#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言—探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 ​&#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;GeekHub &#x1f341; 如果觉得博…