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

表示数值的字符串

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

class Solution {
public:
    int id = 0; // 全局遍历方式
    // 查询是否为+-号,若是,后一位必然为整数才符合数值
    bool has_symhol(string str)
    {
        if(id < str.size() && (str[id] == '-' || str[id] == '+' ))
            id++;
        return integer(str);
    }

    // 判断后一位是否为整数,若一直是,则不断更新id的数值
    bool integer(string str){
        int tmp = id;
        while(id < str.size() &&(str[id] >= '0' && str[id] <= '9'))
            id++;
        return id > tmp;
    }

    bool isNumeric(string str) {
        // write code here
        // 去除开始空格
        if (str.empty()) return false;
        while (str[id] == ' ' && id < str.size()) { // 注意迭代边界
            id++;
        }
        int n = str.size() - 1; // 记得包含最后一个隐藏字段'\n'
        while (str[n] == ' '&& n >= 0) { // 注意迭代边界
            n--;
        }
        std::cout << " str size : " << str.size() << " " << id << " " << n << std::endl;
        if(id > n) return false; // 全是空格时,则非数值字符串
        // flag记录当前走过的字符符合数值情况
        bool flag = has_symhol(str);    // 检查一下 + - 存在情况
                                        // 若为带符号的数值,则判断过程中id已更新到下一个,至少下次遍历至id+2
        std::cout << flag << id << std::endl;
        // 如有.
        if(id <= n && str[id] == '.'){
            id++;
            flag = integer(str) || flag;    // 若为带符号数值,则小数点后可为E? 是的,-1.E4表示-40000
                                            // . 后一位只能跟数字则才为true
        }
        std::cout << flag << id << std::endl;
        // 若有e,后面一位到最后只能为数字才符合科学计数法
        if(id <= n && (str[id] == 'e' || str[id] == 'E'))
        {
            id++;
            flag = has_symhol(str) && flag;
        }
        std::cout << flag << id << std::endl;
        return flag&&(id == n+1);   // id == n +1 表示好好遍历到最后一个位置了。记得别漏最后‘\n’
    }
};

挤挤刷刷! 文章被收录于专栏

记录coding过程

全部评论

相关推荐

今年读完研的我无房无车无对象,月入还没有过万&nbsp;看到他在朋友圈晒房产证,感叹自己白读了这么多年书
小浪_Coding:学历不代表就能赚多少钱, 自己硕士学历怎么说也是一方面好事, 工作只是为了谋生, 赚钱跟学历不挂钩, 看自己走什么样的路,做什么选择
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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