zoukankan      html  css  js  c++  java
  • 表示数值的字符串

    题目描述

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

      

  • 相关阅读:
    ADO.NET 数据连接查询
    弹出消息对话框类
    C# 火星文转化 算法 dictionary 的使用案例
    微软官方的SqlHelper
    jsHelper
    【VC++积累】之六、MFC简要剖析
    C# 统计文章中字符的种类和个数 哈希表和字典的使用
    C# NetHelper
    C# XML操作类 XmlHelper
    【VS++积累】之七、黑客编程之匿名管道
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10695348.html
Copyright © 2011-2022 走看看