1. 题目

这是《剑指offer》上的一道题,刚开始觉得这是一道挺简单的题目,后来发现自己太年轻了,考虑的因素太少了,思考了而是分钟还是无从下手,看了作者的思路深深被他折服了,题目如下:

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

2. 思路

表示数值的字符串遵循模式 A[.[B]][e|EC] 或者 .B[e|EC],其中 A 为数值的整数部分,B 紧跟着小数点为数值的小数部分,C 紧跟着 'e' 或者 'E' 为数值的指数部分。在消暑利可能没有数值的整数部分。例如,小数 .123 等于 0.123。因此 A 部分不是必需的。如果一个数没有整数部分,那么它的小数部分不能为空。

上述 A 和 C 都是可能以 '+' 或者 '-' 开头的 0~9 的数位串;B 也是 0~9 的数位串,但前面不能有正负号。

以表示数值的字符串 "123.45e+6" 为例,"123" 是它的整数部分 A,"45" 是它的小数部分 B,"+6" 是它的指数部分 C。

判断一个字符串是否符合上述模式,首先应该扫描 0~9 的数位,也就是上面数值中表示整数的 A 部分。如果遇到小数点,则开始扫描数值小数部分 B。如果遇到 'e' 或者 'E',则开始扫描表示数值指数的 C 部分。根据这样的思路,给出参考代码:

public class Main{
public boolean isNumeric(char[] str){
if(str==null)
return false;
// 这个数组就一个元素,存储遍历字符串的下标
int[] index = {0};
// 先遍历字符串的整数部分
boolean numeric = scanInteger(str,index);
// 碰到小数点时,开始遍历 B 部分
if(index[0]<str.length && str[index[0]]=='.'){
index[0]++;
/*
* 这里使用 || 的原因
* 1. 小数可以没有整数,如 .123 等于 0.123
* 2. 小数点后面可以没有数字,如 223. 等于 233.0
* 3. 当然,小数点前面和后面都可以有数字,如 2233.444
*/
numeric = scanUnsignedInteger(str,index) || numeric;
}
// 如果出现 'e' 或者 'E',开始遍历指数部分
if(index[0]<str.length && (str[index[0]]=='e' || str[index[0]]=='E')){
index[0]++;
/*
* 这里使用 && 的原因
* 1. 当 e 或 E 前面没有数字时,整个字符串不能表示数字,如 .e1、e2。
* 2. 当 e 或 E 后面没有整数时,整个字符串不能表示数字,如 23e、23e+5.4
*/
numeric = numeric && scanInteger(str,index);
}
return index[0]==str.length && numeric;
} /*
* 该函数用来扫描字符串中 0~9 的数位(类似于一个无符号整数),可以用来匹配前面数值
* 模式中的 B 部分
*/
private boolean scanInteger(char[] str,int[] index){
if(index[0]<str.length && (str[index[0]]=='+' || str[index[0]]=='-'))
index[0]++;
return scanUnsignedInteger(str,index);
} /*
* 该函数扫描可能以表示正负号的 '+' 或者 '-' 开头的 0~9 的数位(类似于一个有符号整数)
* 可以用来匹配前面数值模式中的 A 和 C 部分。
*/
private boolean scanUnsignedInteger(char[] str,int[] index){
int before = index[0];
while(index[0]<str.length && str[index[0]]>='0' && str[index[0]]<='9')
index[0]++;
return index[0]>before;
}
}

更多《剑指offer》的题目以及源代码可以参考我的 github

剑指offer之字符串是否为数值的更多相关文章

  1. 剑指Offer:字符串排列【38】

    剑指Offer:字符串排列[38] 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bc ...

  2. 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

    剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...

  3. 剑指 Offer 38. 字符串的排列

    剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" ...

  4. 【剑指Offer】字符串的排列 解题报告(Python)

    [剑指Offer]字符串的排列 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  5. 剑指offer 67. 字符串转换为整数(Leetcode 8. String to Integer (atoi))

    题目:剑指offer 67题 需要考虑的情况:空指针.nullptr.空字符串"".正负号.数值溢出.在写代码的时候对这些特殊的输入都定义好合理的输出.可以定义一个全局布尔型变量g ...

  6. 【Java】 剑指offer(38) 字符串的排列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串ab ...

  7. 【Java】 剑指offer(50-1) 字符串中第一个只出现一次的字符

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在字符串中找出第一个只出现一次的字符.如输入"abacc ...

  8. 【剑指offer】字符串的组合

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/26405471 转载请注明出处:http:// ...

  9. Go语言实现:【剑指offer】字符串的排列

    该题目来源于牛客网<剑指offer>专题. 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,b ...

随机推荐

  1. Go的100天之旅-04基础数据类型

    基础数据类型 在变量的定义中,我们讲了每个变量是有类型的,类型在计算机中是用来约束数据的解释.Go语言和其它计算机语言一样,提供丰富了丰富的数据类型,我们就来看看到底有哪些类型,同时也可以比较一下它和 ...

  2. 据说比Spring快44倍的web开发框架,不妨试试

    该框架称为:**light-4j **.官方网站简介:A fast, lightweight and more productive microservices framework.很简单,翻译过来就 ...

  3. 利用Serverless应用搭建Hexo博客

    本文将介绍如何使用火爆的Serverless应用,15分钟快速搭建Hexo博客.以腾讯云提供的Serverless应用–云开发为例: 步骤1:安装 CloudBase CLI 以及本地部署 Hexo ...

  4. .net core https 双向验证

    文章来自:https://www.cnblogs.com/axzxs2001/p/10070562.html 关于https双向认证的知识可先行google,这时矸接代码. 为了双向认证,我们首先得准 ...

  5. idea2020安装教程

    2019最新版IDEA亲测可用, 2020最新版IDEA亲测可用, 重要的事说三遍: 如果自己破解不成功建议加群咨询群主:422167709   成功的也可以进群交流 激活码1 N757JE0KCT- ...

  6. I 2 C、 SPI、 USB驱动架构

    根据图12.4, Linux倾向于将主机端的驱动与外设端的驱动分离, 而通过一个核心层将某种总线的协议进行抽象, 外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用. 对于I 2 C. S ...

  7. 数据页结构 .InnoDb行格式、以及索引底层原理分析

    局部性原理 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中. 首先要明白局部性原理能解决的是什么问题,也就是主存容量远远比缓存大, CP ...

  8. 前端学习(十五):了解 Javascript

    进击のpython ***** 前端学习--了解JavaScript Javascript是一种运行在浏览器中的解释型的编程语言 还记得我们在说python的时候提过解释型和编译型的区别 在解释型语言 ...

  9. java基础(五)--基本数据类型、占用字节、数值范围

    一.Java基本数据类型 基本数据类型有8种:byte.short.int.long.float.double.boolean.char 分为4类:整数型.浮点型.布尔型.字符型. 整数型:byte. ...

  10. pandas之cut

    cut( )用来把一组数据分割成离散的区间. cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_low ...