zoukankan      html  css  js  c++  java
  • Leetcode 65 Valid Number 字符串处理

    由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题。

    题意:判断字符串是否是一个合法的数字

    定义有符号的数字是(n),无符号的数字是(un),有符号的兼容无符号的

    合法的数字只有下列几种组合:(其中E可以大写)

    有小数点和e

    (n).(un)e(n)

    .(un)e(n)

    (n).e(n)

    仅仅有小数点的

    (n).(un)

    .(un)

    (n).

    仅仅有e的

    (n)e(n)

    没有e的

    (n)

    只要分别判断这上面的8种情况就能得到正确的答案

    更好的解法其实是一种叫做有限状态机的解法,下次再说这题的时候会有介绍

    class Solution {
    public:
        bool isNumber(string s) {
            int m = 0;
            for (; isspace(s[m]); m++);
            int n = s.size() - 1;
            for (; isspace(s[n]); n--);
            if (m == s.size()) s = "";
            else s = string(s.begin() + m, s.begin() + n + 1);
            int hasdot = s.find(".",0);
            int hase = s.find_first_of("eE", hasdot == string::npos ? 0 : hasdot);
    
            if (hasdot != string::npos && hase != string::npos){//有小数点和e
                if (isSignNumber(string(s.begin(), s.begin() + hasdot))){
                    return  isNumber(string(s.begin() + hasdot + 1, s.begin() + hase), 1) && isSignNumber(string(s.begin() + hase+1, s.end()));
                }
                else if (isUnsignNumber(string(s.begin() + hasdot + 1, s.begin() + hase))){
                    return  isNumber(string(s.begin(), s.begin() + hasdot), 0) && isSignNumber(string(s.begin() + hase + 1, s.end()));
                }
                else return false;
            } 
            else if (hasdot != string::npos && hase == string::npos){//仅仅有小数点的
                if (isSignNumber(string(s.begin(), s.begin() + hasdot))){
                    return  isNumber(string(s.begin() + hasdot + 1, s.end()), 1);
                }
                else if (isUnsignNumber(string(s.begin() + hasdot + 1, s.end()))){
                    return  isNumber(string(s.begin(), s.begin() + hasdot), 0);
                }
                else return false;
            }
            else if (hasdot == string::npos && hase != string::npos){//仅仅有e的
                return isSignNumber(string(s.begin(), s.begin() + hase)) && isSignNumber(string(s.begin() + hase + 1, s.end()));
            }
            else return isSignNumber(string(s.begin() + hase + 1, s.end()));//没有e的
            
        }
        bool isNumber(string s, int type){
            switch (type)
            {
            case 0:
                if (s == "+" || s == "-" || s == "")  return true;
                return isSignNumber(s);
                break;
            case 1:
                if (s == "")  return true;
                return isUnsignNumber(string(s.begin(), s.end()));
                break;
            default:
                return false;
                break;
            }
        }
    
        bool isSignNumber(string s){
            if (s.size() == 0) return false;
            if (s[0] == '+' || s[0] == '-') s = string(s.begin() + 1, s.end());
            return isUnsignNumber(s);
        }
        bool isUnsignNumber(string s){
            if (s.size() == 0) return false;
            for (string::size_type i = 0; i < s.size(); ++i){
                if (!isdigit(s[i])) return false;
            }
            return true;
        }
    };
  • 相关阅读:
    第一个WCF的程序
    第一节 SOA的基本概念和设计思想
    数组拷贝 copyOf()
    dict和set
    类的构造函数
    深入理解 Python 异步编程(上)
    Nifi自定义processor
    java inputstream to string stack overflow
    java inputstream to string
    oracle 导入 dmp
  • 原文地址:https://www.cnblogs.com/onlyac/p/5464798.html
Copyright © 2011-2022 走看看