【剑指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可以为有符号数(带+-号) 小数点.后面必须是无符号数或者没有 ...
 
随机推荐
- Oracle批量恢复drop操作删除的表、索引等对象
			
/**********************************************************************查询Drop操作删除的对象select * from re ...
 - Java 设计模式—装饰者模式
			
在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式. 演示样例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @autho ...
 - codeforces   437D   The Child and Zoo
			
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
 - 初触Python,关于pyquery解析html(百度贴吧)
			
一直听同事说Python是个奇妙的语言,上周在逛知乎的时候深受这个话题的启示. 能利用爬虫技术做到哪些非常酷非常有趣非常实用的事情? 先是说到IDE的选择,作为python新人,尽管知道mac终端自带 ...
 - 刚開始学习的人非常有用之chm结尾的參考手冊打开后无法正常显示
			
从网上下载了struts2的參考手冊.chm(本文适用全部已.chm结尾的文件)不能正常打开使用. 如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/ ...
 - C++对象内存布局 (二)
			
在上一篇文章中讨论了C++单一一般继承的对象内存布局http://www.cnblogs.com/uangyy/p/4621561.html 接下来继续讨论第二种情况: 2.单一的虚拟继承:有成员变量 ...
 - 检测含有挖矿脚本的WiFi热点——果然是天下没有免费的午餐
			
见:http://www.freebuf.com/articles/web/161010.html 本质上是在开放wifi热点,自己搭建挖掘的网页,让接入的人访问该网页. 802.11无线协议本身特点 ...
 - c programs
 - Moon Http Server,强大如斯的全脚本web服务器
			
Moon Http Server(MHS) 是一个使用Pascal脚本的高性能Web服务器. 昨天晚上是第一次接触.花了30分钟入门,非常强大.是Delphi 者开发Web的福音. 引用一下作者的介绍 ...
 - Hadoop Hive概念学习系列之Hive里的2维坐标系统(第一步定位行键   ->   第二步定位字段)(二十三)
			
HBase里的4维坐标系统(第一步定位行键 -> 第二步定位列簇 -> 第三步定位列修饰符 -> 第四步定位时间戳) HBase里的4维坐标系统(第一步定位行键 ...