表示数值的字符串

表示数值的字符串

http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2

菜菜的csdn个人博客:https://blog.csdn.net/qq_39618369
题目:**
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。


第一次写牛客题解哈哈哈....哈哈哈
思路:
方法一:考虑所有情况,从前往后依次判断

  1. 正负号:只能出现在最前面或者e/E后面(紧跟着),并且不能是最后一个字符
  2. 小数点:只能出现一次且不能出现在e/E的后面
  3. e/E:e/E的前后都要有数字,且只能出现一次

方法二:正则表达式【顺便复习了一下,这个教程写的蛮好】

return string.matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
 [+-]?                        正或负符号出现与否(?代表出现0次或1次)
\\d*                          整数部分是否出现,d表示整数,*表示任意次
(\\.\\d+)?                    如果出现小数点,那么小数点后面必须有数字,+表示>=1次
([eE][+-]?\\d+)?              如果存在指数部分,那么e或E肯定出现,后面可以有+或-可以不出现, 紧接着必须跟着整数

Java代码:

public class IsNumeric {
    public static void main(String[] args) {
        IsNumeric isNumeric = new IsNumeric();
        System.out.println(isNumeric.isNumericOne("12e+5.4".toCharArray()));

    }

    /**
     * 方法一:考虑所有情况,从前往后依次判断
     */
    public boolean isNumericOne(char[] str) {
        if (str == null || str.length == 0) {
            return false;
        }
        //只有一个非数字字符
        if (str.length == 1 && (str[0] < '0' || str[0] > '9')) {
            return false;
        }
        //是否已经出现小数点,e/E
        boolean decimal = false, hasE = false;
        int i = 0;
        //逐个分析+、-、.、e/E能出现的条件,数字可以随时出现;满足任何一个就继续,不满足就跳出
        for (; i < str.length; i++) {
            //正负号只能出现在最前面或者e/E后面(紧跟着),并且不能是最后一个字符
            if (i == 0 && isSymOrE(str[0], 1)
                    || i > 0 && i < str.length - 1 && isSymOrE(str[i - 1], 2) && isSymOrE(str[i], 1)) {
                continue;
            }
            //小数点只能出现一次且不能出现在e/E的后面
            else if (!decimal && !hasE && str[i] == '.') {
                decimal = true;
                continue;
            }
            //e/E的前后都要有数字,且只能出现一次
            else if (i > 0 && i < str.length - 1 && !hasE && isSymOrE(str[i], 2)) {
                hasE = true;
                continue;
            }
            //数字可以随时出现
            else if (str[i] >= '0' && str[i] <= '9') {
                continue;
            } else {
                break;
            }
        }
        return i == str.length;//只需判断能不能正常结束
    }

    /** 是否为正负号(1)或者e/E(2) */
    public boolean isSymOrE(char c, int x) {
        if (x == 1) {
            return c == '-' || c == '+';
        } else if (x == 2) {
            return c == 'e' || c == 'E';
        }
        return false;
    }

    /**
     * 方法二:正则表达式
     */
    public boolean isNumericTwo(char[] str) {
        if (str == null || str.length == 0) {
            return false;
        }
        if (str[0] == 'e' || str[0] == 'E') {//第一个字符不能是e或者E
            return false;
        }
        String string = String.valueOf(str);//注意:str.toString()是把str的首地址转化成了String
        return string.matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");//这里其实包括了第一个字符为e/E的情况
    }
}
全部评论

相关推荐

06-27 15:29
门头沟学院 Java
点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务