【剑指Offer】53、表示数值的字符串
题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100", "5e2", "-123"," 3.1416" 和 "-1E-16" 都表示数值。 但是 "12e", "1a3.14", "1.2.3", "+-5" 和 "12e+4.3" 都不是。
解题思路:
本题相对还是比较简单的,重点在于考虑到所有的情况,能够写出表示数值的字符串模式,然后就可以根据正则表达式或者字符串匹配的相应方法来做。
表示数值的字符串遵循共同的模式:A[.[B]][e|EC]
或者.B[e|EC]
。
以上模式的含义是:A为数值的整数部分,B为跟在小数点之后的小数部分,C为跟在e或者E之后的指数部分。其中,A部分可以没有,比如小数.123代表0.123。如果一个数没有整数部分,那么小数部分必须有。
具体说来,A和C(也就是整数部分和指数部分)都是可能以"+"、"-"开头或者没有符号的数字串,B是数字序列,但前面不能有符号。
我们可以通过顺序扫描字符串来判断是否符合上述模式,首先尽可能多的扫描数字序列(开头可能有正负号),如果遇到小数点,那么扫描小数部分,遇到e或者E,则开始扫描指数部分。
除了顺序扫描以外,判断一个字符串是否满足某个模式,我们很容易想到的一个办法是使用正则表达式,以下给出这两种方法代码实现。
正则表达式的解法很简洁,关于正则表达式的语法参考另外一篇博文:正则表达式
编程实现(Java):
public class Solution {
/*
思路:表示数字的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC]
A为整数部分,B为小数部分,C为指数部分
开头可能有正负号
两种方法:逐位判断、正则表达式
*/
public boolean isNumeric(char[] str) {
//方法一:逐位判断
if(str==null)
return false;
boolean sign=false,decimal=false,hasE=false; //标记符号、小数点、指数符号E是否出现过
for(int i=0;i<str.length;i++){
if(str[i]=='e'||str[i]=='E'){ //有E或者e出现
if(i==str.length-1) //E不能是最后一位,后面必须跟指数
return false;
if(hasE) return false; //E只能出现一次
hasE=true;
}else if(str[i]=='.'){
if(hasE||decimal) //指数不能有.小数点只能出现一次
return false;
decimal=true;
}else if(str[i]=='+'||str[i]=='-'){
//第一次出现,开头或者e之后
if(!sign && i!=0 && str[i-1]!='e' && str[i-1]!='E') //不在开头也不在e之后
return false;
//第二次出现,E之后
if(sign && str[i-1]!='E' && str[i-1]!='e')
return false;
sign=true;
}else if(str[i]>'9'||str[i]<'0') //不合法字符
return false;
}
return true;
}
//方法二:正则表达式
//+代表出现一次或多次,*代表出现0次或多次,?代表出现0次或者一次
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
/*
为什么是两个反斜杠
首先字符串中的\\被编译器解释为\ -------》 第一步,编译器将字符串转变为“正则表达式”
然后作为正则表达式,\.又被正则表达式引擎解释为. ----------------> 第二步,才开始把第一步的结果当做是正则表达式,开始进行匹配!
如果在字符串里只写\.的话,第一步就被直接解释为.,之后作为正则表达式被解释时就变成匹配任意字符了
*/
}
}
【剑指Offer】53、表示数值的字符串的更多相关文章
- 剑指Offer 53. 表示数值的字符串 (字符串)
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- [剑指Offer] 53.表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- [剑指offer] 53. 表达数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- 剑指 Offer 20. 表示数值的字符串 + 有限状态自动机
剑指 Offer 20. 表示数值的字符串 Offer 20 常规解法: 题目解题思路:需要注意几种情况: 输入的字符串前后可能有任意多个空格,这是合法的. 正负号: (1)正负号只能出现一次. (2 ...
- 【Java】 剑指offer(20) 表示数值的字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...
- Go语言实现:【剑指offer】表示数值的字符串
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2",&qu ...
- 剑指offer——22表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- 《剑指offer》-表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...
- 剑指offer:表示数值的字符串
题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...
- 剑指 Offer 20. 表示数值的字符串
方法:分为几个部分判断 DA[.B][E/eC] D 其中D表示前后的空格,需要处理,跳过即可 A可以带正负号 有符号数 B无符号数 C可以为有符号数(带+-号) 小数点.后面必须是无符号数或者没有 ...
随机推荐
- maven 的plugin 的使用
mvn [plugin-name]:[goal-name] mvn compiler:compile 这里写的十分详细: https://www.tutorialspoint.com/maven/ma ...
- IBM CEO罗睿兰:科技公司屹立百年的3个秘诀
假设有不论什么科技公司能够完美阐释"转型"这个词的含义,那么这家公司非创立103年的IBM莫属. 如今,它的变化更胜以往. 在<財富>杂志周二于美国加利福尼亚州拉古纳尼 ...
- Android给定坐标计算距离
给定两点的经纬度.计算两点之间的距离.这里要注意经纬度一定要依照顺序填写 1. 利用android中的工具获得,单位是米 float[] results=new float[1]; Location. ...
- 【SDOI2008】【BZOJ2049】Cave 洞穴勘測
Description 辉辉热衷于洞穴勘測.某天,他依照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘測,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成.而且每条通道连接了恰好 ...
- 泛型和面向对象C++
1. 在类内部定义的函数默觉得inline,内联函数应该在头文件里定义,由于其定义对编译器必须是可见的,以便编译器可以在调用点内联展开该函数的代码. 此时,仅有函数原型是不够的. 2.assert 3 ...
- USACO money packageDP
裸0/1背包,就是从各种币种里面拿来凑足N元,求最多有多种方案.用dp[i][j]表示选前i个币种凑成j的方案数量 状态转移方程: dp[i][j] = dp[i- 1][j] j < c ...
- CodeForces - 743D Chloe and pleasant prizes
Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- GROUPPING和ROLLUP的基本知识
1.GROUPPING 是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0. ...
- acc文件的运行
1.method 1: use "acc" >acc hello.acc world.mc <--- compilation will generate the hel ...
- Cracking the Coding Interview 10.7
Design an algorithm to find the kth number such that the only prime factors are 3,5 and 7 方法一: a[i]= ...