表示數值的字符串【轉載】

1 問題

請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100""5e2""-123""3.1416""0123"都表示數值,但"12e""1a3.14""1.2.3""+-5""-1E-16""12e+5.4"都不是。

2 解題思路

  1. 先去除字符串首尾的空格
  2. 然後根據e劃分指數和底數
  3. 判斷指數和底數是否合法即可

3 代碼實現

class Solution {
public:
    bool isNumber(string s) {
        //1、從首尾尋找s中不爲空格首尾位置,也就是去除首尾空格
        int i=s.find_first_not_of(' ');
        if(i==string::npos)return false;
        int j=s.find_last_not_of(' ');
        s=s.substr(i,j-i+1);
        if(s.empty())return false;

        //2、根據e來劃分底數和指數
        int e=s.find('e');

        //3、指數爲空,判斷底數
        if(e==string::npos)return judgeP(s);

        //4、指數不爲空,判斷底數和指數
        else return judgeP(s.substr(0,e))&&judgeS(s.substr(e+1));
    }

    bool judgeP(string s)//判斷底數是否合法
    {
        bool result=false,point=false;
        int n=s.size();
        for(int i=0;i<n;++i)
        {
            if(s[i]=='+'||s[i]=='-'){//符號位不在第一位,返回false
                if(i!=0)return false;
            }
            else if(s[i]=='.'){
                if(point)return false;//有多個小數點,返回false
                point=true;
            }
            else if(s[i]<'0'||s[i]>'9'){//非純數字,返回false
                return false;
            }
            else{
                result=true;
            }
        }
        return result;
    }

    bool judgeS(string s)//判斷指數是否合法
    {   
        bool result=false;
        //注意指數不能出現小數點,所以出現除符號位的非純數字表示指數不合法
        for(int i=0;i<s.size();++i)
        {
            if(s[i]=='+'||s[i]=='-'){//符號位不在第一位,返回false
                if(i!=0)return false;
            }
            else if(s[i]<'0'||s[i]>'9'){//非純數字,返回false
                return false;
            }
            else{
                result=true;
            }
        }
        return result;
    }
};

int main(int argc,char* argv[])
{  
	Solution sol;
	bool res = sol.isNumber("+100-");
	cout << res << endl;
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述


以上內容來自:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章