您当前的位置: 首页 >  算法

Phil Arist

暂无认证

  • 1浏览

    0关注

    276博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

算法修炼53、表示数值的字符串

Phil Arist 发布时间:2021-10-29 10:38:27 ,浏览量:1

 题目描述:

  请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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'9'||str[i] 第二步,才开始把第一步的结果当做是正则表达式,开始进行匹配!
		如果在字符串里只写\.的话,第一步就被直接解释为.,之后作为正则表达式被解释时就变成匹配任意字符了
         */
    }
}
关注
打赏
1662360869
查看更多评论
立即登录/注册

微信扫码登录

0.0440s