牛客网--表示数值的字符串(字符串)

题目:

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

知识点:

正则表达式:

\d:数字字符匹配,0-9.

[eE]:匹配e或E,匹配括号中任意一个字符

\\+,\\-:+,-

*:出现0次或多次

+:出现一次或多次

?:是否发生

注意:\\+代表+号,\+代表出现一次或多次的+;\:将下一个字符定为标记符。

思路:

方法一:正则表达式

[\\+\\-]?:+或-号是否出现;\\d*:数字出现0或多次;(\\.\\d+)?:.若出现后面数字至少出现一次;([eE][\\+\\-]?\\d+)?:e或E出现,+或-出现,后面数字至少出现一次。

方法二:正常比较法

1、将str下标单独标出,建立判断的flag(boolean类型);

2、首先判断是否有+-号的出现

3、当.出现,判断后面是否有数字||前面有数字(flag标记)

4、当有E或e出现,判断后面是否有+-和数字&&前面一定有数字(flag标记)

5、结果为flag&&下标到最后

答案:

public class Solution {
    public boolean isNumeric(char[] str) {
        String s = String.valueOf(str);
        return s.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");//正则表达式方法
    }
}
public class Solution {
    private int index = 0;
    public boolean isNumeric(char[] str) {
        //正常判断
        if(str.length==0){return false;}
        boolean flag = scanInteger(str);//开头是否有+-号,并且+-号后面是否有数字
        if(index<str.length && str[index]=='.'){
            index++;
            //flag = flag || scanUnsignedInteger(str);//有短路特性,若flag为true,后面就不判断了
            flag = scanUnsignedInteger(str) || flag;//.前后至少出现一次数字
        }
        if(index<str.length && (str[index]=='e' || str[index]=='E')){
            index++;
            flag = flag && scanInteger(str);//如果e前面不是数字,短路特性,直接排除
        }
        return flag && index==str.length;
    }
    public boolean scanInteger(char[] str){//判断是否有+-号
        if(index<str.length && (str[index]=='+' || str[index]=='-')){
            index++;
        }
        return scanUnsignedInteger(str);
    }
    public boolean scanUnsignedInteger(char[] str){//判断是否有数字
        int start = index;
        while(index<str.length && str[index]>='0' && str[index]<='9'){
            index++;
        }
        return start<index;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值