美文网首页
【剑指 offer】表示数值的字符串。

【剑指 offer】表示数值的字符串。

作者: 邓泽军_3679 | 来源:发表于2019-04-12 09:26 被阅读0次

1、题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。

但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

注意:

1.小数可以没有整数部分,例如.123等于0.123;
2.小数点后面可以没有数字,例如233.等于233.0;
3.小数点前面和后面可以有数字,例如233.666;
4.当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
5.当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

样例:
输入: "0"
输出: true

2、问题描述:

判断一个字符串是否表示的数字。这一个题主要是列举除所有的情况就可以了。

3、问题关键:

1.第一步,去掉行首和行尾的空格。
2.如果行首有一个正负号,那么直接忽略。
3.此时字符串为空或者后面只有一个 ‘.‘那么就返回false。
4.遍历字符串。如果数字直接忽略。
5.‘.'只能出现在‘e’的前面,且’.'和‘e’只能出现1次,否则不合法。
6.e后面为空,e前面为空,e多于一次,e前面只有一个‘.‘,都不合法。
7.e后面为正负号,但后面为空。
8.其他字符,false;

4、C++代码:

class Solution {
public:
    bool isNumber(string s) {
        int i = 0;
        while(i < s.size() && s[i] == ' ') i ++; //去掉行首的空格。
        int j = s.size() - 1;
        while(j >= 0 && s[j] == ' ') j --;//去掉行尾的空格。
        if (i > j) return false;
        s = s.substr(i, j - i + 1);

        if (s[0] == '-' || s[0] == '+')  s = s.substr(1);//如果行首只有一个正负号,直接忽略。
        if (s.empty() || s[0] == '.' && s.size() == 1) return false;//如果为空或者只有一个'.'不合法。

        int dot = 0, e = 0;
        for (int i = 0; i < s.size(); i ++) {//遍历字符串
            if (s[i] >= '0' && s[i] <= '9');
            else if (s[i] == '.') {
                dot ++;
                if (e || dot > 1) return false;//如果'.'在'e'后面出现或者dot > 1不合法。
            }
            else if (s[i] == 'e' || s[i] == 'E') {
                e ++;
                if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.') 
                    return false;//e后面为空;e前面为空;e多于1个;e前面只有一个'.'
                if (s[i + 1] == '+' || s[i + 1] == '-') {
                    if (i + 2 == s.size()) return false;//e后面跟着正负号,后面为空。
                    i ++;
                }   
            }
            else return false;
        }
        return true;
    }
};

相关文章

网友评论

      本文标题:【剑指 offer】表示数值的字符串。

      本文链接:https://www.haomeiwen.com/subject/nfrqwqtx.html