码迷,mamicode.com
首页 > 其他好文 > 详细

表示数值的字符串

时间:2019-04-12 13:40:40      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:highlight   nbsp   函数   解题思路   位置   sub   char   lse   逗号   

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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; } };

  

表示数值的字符串

标签:highlight   nbsp   函数   解题思路   位置   sub   char   lse   逗号   

原文地址:https://www.cnblogs.com/chengsheng/p/10695348.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!