表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

 

解题思路:

关键点是分析e存在的情况下前面数字的合法性和后面数字的合法性。记录e前面数字的值,记录e后面数字的值,同时在记录时判断合法性。

 

class Solution {
public:
    bool isNumeric(char* string)
    {
        //e/E出现的位置
        int e = -1;
        //为了方便描述,下面所说e代表e/E
        //e前面加减号的个数
        int epreplus = 0;
        //e后面加减号的个数
        int ebehplus = 0;
        //e前面逗号的个数
        int epredot = 0;
        //e后面逗号的个数
        int ebehdot = 0;
        //e前面整数部分的值       //e前面小数部分的值
        double eprev1 = 0.0, eprev2 = 0.0;
        //e前面逗号的位置
        int epredotpos = -1;
        //e前面的值
        int ebehv = 0;
        for(int i = 0 ; string[i] != '\0' ; i++){

            if(string[i] == 'E' || string[i] == 'e'){
                //出现两次e
                if(e != -1){
                //    cout<<"c1"<<endl;
                    return false;
                }
                e = i;
                //非法字符判断
            }else if(string[i] != '.' && string[i] != '+' && string[i] != '-'
                     && (!(string[i]>='0' && string[i] <= '9'))){

                  //      cout<<"c2"<<endl;
                         return false;
            }
//逗号次数判断 if(string[i] == '.'){ if(e == -1){ epredot ++; //如果e前面逗号大于1个 if(epredot>1) { // cout<<"c3"<<endl; return false; } }else{ //e后面出现逗号 // cout<<"c4"<<endl; return false; } }
//加减号次数判断 if(string[i] == '+' || string[i] == '-'){ if(e != -1){ epreplus++; //e前面加减号出现次数大于1 if(epreplus>1){ // cout<<"c5"<<endl; return false; } }else{ ebehplus++; //e后面加减号出现次数大于1 if(ebehplus >1){ // cout<<"c6"<<endl; return false; } } } if(string[i] != 'e' && string[i] != 'E'){ if(e == -1){ if(string[i] == '-' || string[i] == '+'){ //e前面的逗号必须是第一个字符 if(i != 0){ // cout<<"c7"<<endl; return false; } } if(string[i] == '.'){ epredotpos = i; }else if(string[i] >= '0' && string[i] <= '9'){ if(epredotpos == -1){ //e前面整数部分 eprev1 = eprev1 * 10 + string[i]-'0'; }else{ //e前面小数部分 eprev2 = eprev2 + (string[i]-'0')/pow(10, i-epredotpos); } } }else{ if(string[i] == '+' || string[i] == '-') { //e后面正负号必须紧邻e if(i-e != 1){ // cout<<"c8"<<endl; return false; } } if(string[i] >= '0' && string[i] <= '9'){ // cout<<"string[i]="<<string[i]<<endl; //e后面的值 ebehv = ebehv*10 + string[i]-'0'; } } } } double eprev = eprev1+eprev2; //cout<<"eprev="<< eprev<<endl; //存在e且e前面的值为0或小于1 if(e != -1 && (eprev == 0 || eprev < 1)){ // cout<<"c10"<<endl; return false; } //存在e且e后面的值等于0 if(e != -1 && ebehv == 0){ //cout<<"c11"<<endl; return false; } return true; } };

  

posted @ 2019-04-12 12:47  tcgoshawk  阅读(322)  评论(0编辑  收藏  举报