题解 | #表示数值的字符串#

表示数值的字符串

http://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8

描述

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

示例一:

输入:
"123.45e+6"
返回值:
true

示例二:

输入:
"1.2.3"
返回值:
false

题目简述

        给定一个字符串判断它是否为表示数值。

算法一: 分治 (C++)

        时间复杂度:O(N)

        思路:

            1. 对于数字来说:必须存在数字。
            2. 对于 ' . ' 来说:  (1) : 只能出现一次。
                                        (2) : 不能在 e / E 的后面。
            3. 对于e、E来说: (1) : 只能出现一次。
                                        (2) :  前面一位 和 后面一位或者两位 必须是数字。
            4. 对于 ' + ' 、' - '  来说:   只能出现在 首位 或者 e/E的后面一位。

代码:


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return bool布尔型
     */
    bool digit(char ch){ //判断是否是数字
        if(ch>='0'&&ch<='9') return true;
        return false;
    }
    bool isNumeric(string str) {
        // write code here
        int exp=0;//是否出现过E、e
        int dot=0;//是否出现过 '.'
        int sym=0;//是否出现过 +、-
        int dig=0;//是否出现过数字
        int len=str.size();
        for(int i=0;i<len;i++){
            if(str[i]=='.'){
                if(dot||exp) return false;
                dot=1;
            }
            else if(str[i]=='e'||str[i]=='E'){
                if(exp||!(digit(str[i-1])&&(digit(str[i+1])||digit(str[i+2])))) return false;
                exp=1;
            }
            else if(str[i]>='0'&&str[i]<='9'){
                dig=1;
                continue;
            }
            else if(str[i]=='+'||str[i]=='-'){
                if(i!=0&&!(str[i-1]=='e'||str[i-1]=='E')) return false;
            }
            else return false;
        }
        return dig;
    }
};


算法二:

        时间复杂度:O(N)

        思路:

            直接利用函数将字符串转化为数字,若是异常说明该字符串不能表示数字,则进行异常处理,返回false即可。

代码:


import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return bool布尔型
     */
    public boolean isNumeric (String str) {
        // write code here
        try{
            Double res=Double.parseDouble(str);
            return true;
        }catch(Exception e){
            return false;
        }
    }
}



全部评论

相关推荐

Hakasee:我的简历和你的基本一样,上周去了上海,boss投了三百家, 三家线下面试 第一家没有做题,全是八股和项目,因为第一次面试不怎么熟练,挂了 第二家,给你几个题目(①css垂直居中文字,字体每两秒闪烁一下以及点击弹窗,②给你一个链接,实现可视化地图,③然后是八股,图片性能优化,以及对图片app有什么想法),45分钟内做完,然后老板面试) 第三家特别偏僻,有点阴森,到了之后让了一个工位给我,有四个题目,①格式化时间 年月日当前时间星期几② 正则表达式提取新闻文字,③在文本域输入文字生成选择题以及选项④生成商品排版还是什么来着 三家都是不超过50人的小公司 两家线上牛客笔试(卡伦特,七牛云,但是笔试不仅要考前端,还要考后端,算法,甚至数学题 我的建议是如果只做了这两个vue项目且不怎么熟练的情况下,先沉淀沉淀,把react学了,上海好的公司基本都是react查看图片
点赞 评论 收藏
分享
07-13 14:45
南华大学 Java
北斗导航Compas...:英文和中文之间加个空格,有的句子有句号 有的没。其他没啥问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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