• 关键字:字符串处理
  • 难度:难
  • 前置知识:字符串
  • 题目大意:对于给定的一个字符串,判断其表达的是否为一个数字(整数、实数、科学计数法)

题目描述

Validate if a given string is numeric.

Some examples:

"0" => true

" 0.1 " => true

"abc" => false

"1 a" => false

"2e10" => true

解法

为了叙述的方便,在后文中用str表示需要判断的字符串

这道题目的麻烦之处有两点,一方面是题目说的不清不楚,需要你自己考虑所有细节(当然也可以通过多次尝试),另一方面就是题目本身需要注意的地方的确很多。

总的来说,需要考虑的情况有如下三种:整数小数科学计数法

实际上我们可以将整数和小数都看作实数,然后将科学计数法从'e'分开,前面需要是一个实数,后面需要是一个整数。

然后再对长度为0,正负号等细节进行处理,这道题目就能够顺利解决了,由于这道题并没有什么算法可言,所以各位同学就直接看参考代码来了解更多细节的处理吧~

参考代码

class Solution {
public:
    bool isNumber(string s) {
        // 去掉所有空格
        while (s[0] == ' ') s.erase(0, 1);
        while (s[s.length() - 1] == ' ') s.erase(s.length() - 1, 1);
        //while (s.find(" ") != string::npos) s.erase(s.find(" "), 1);
        if (s.length() == 0) return false;
        // 计算字母个数和最后一个字母
        int count = 0, pos = -1;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z') {
                count ++; pos = i;
            }
        }
        // 多于一个字母
        if (count > 1) return false;
        // 字母不是E
        if (count == 1 && s[pos] != 'E' && s[pos] != 'e') return false;
        // E之后的必须为整数
        if (pos != -1) {
            if (pos == s.length() - 1) return false;
            int num_count = 0;
            for (int i = pos + 1; i < s.length(); i++) {
                // 判断符号
                if (s[i] == '-' || s[i] == '+') {
                    if (i != pos + 1) return false;
                }
                // 非法字符判定
                else if (s[i] < '0' || s[i] >'9') 
                    return false;
                }
                // 统计数字个数
                else {
                    num_count ++;
                }
            }
            // 至少要有一个数字
            if (num_count == 0) return false;
        }
        // E之前的必须为实数
        if (pos == 0) return false;
        if (pos == -1) pos = s.length();
        int dot_count = 0, num_count = 0;
        for (int i = 0; i < pos; i++) {
            // 判断符号
            if (s[i] == '-' || s[i] == '+') {
                if (i != 0) return false;
            }
            // 统计.的个数
            else if (s[i] == '.') {
                dot_count ++;
            }
            // 非法字符判定
            else if (s[i] < '0' || s[i] > '9') {
                return false;
            }
            // 统计数字个数
            else {
                num_count ++;
            }
        }
        // 至少要有一个数字
        if (num_count == 0) return false;
        // .的个数必须为1
        if (dot_count > 1) return false;
        return true;
    }
};

登录发表评论 注册

反馈意见