Leet Code OJ: Valid Number

本文介绍了一种通过编程方式验证给定字符串是否符合有效数字格式的方法。文章详细阐述了一个C++类的实现过程,该类能检查字符串中的特定符号(如+/-、.、e/E)是否位于正确的位置,并确保整个字符串格式符合有效的数字表达形式。
摘要由CSDN通过智能技术生成

题目:
这里写图片描述
补充:true: .1   3.    46.e3      +.8
false:   .e1   0e  0.e

我的代码

class Solution {
public:
    bool isNumber(string s) {

        //去除首尾空格
        size_t first_i = 0, last_i = s.length();
        while (s[first_i] == ' ' && first_i < last_i){
            first_i++;
        }//while
        while (s[last_i - 1] == ' ' && last_i >= 0){
            last_i--;
        }//while

        size_t i;
        unsigned int jia_jian_num1 = 0;    //记录在最前面的+或-号的数目和坐标
                 int jia_jian_pos1 = 0;
        unsigned int jia_jian_num2 = 0;     //记录在指数e或E后面的+或-号的数目和坐标nt
                 int jia_jian_pos2 = 0;
        unsigned int dian_num = 0;          //记录'.'的数目和坐标
                 int dian_pos = 0;
        unsigned int e_num = 0;            //记录e或E的数目和坐标
                 int e_pos = 0;
        unsigned int digit_num = 0;        //记录数字
        for (i = first_i; i<last_i; i++)
        {
            if (s[i] == '+' || s[i] == '-') //存在+或-号,则+或-号只能在最前面或是前面有e或E
            {

                //+或-号在字符最前面,则在该位置合法
                if ((i - first_i) == 0)
                {
                    jia_jian_num1++; //记录当前的加减号数目
                    jia_jian_pos1 = i; //记录坐标

                }
                else if (s[i - 1] == 'e' || s[i - 1] == 'E')    //+或-号前面是e或E,该位置也合法
                {
                    jia_jian_num2++;
                    jia_jian_pos2 = i;
                }
                else{   //既不是最前面也不是在指数e或E的后面
                    //break;
                    return false;
                }

                if ((jia_jian_num1 > 1) || (jia_jian_num2 >1)){   //+和-的数目加起来超过1,表明2种情况中是不合法的
                    // break;
                    return false;
                }

            }
            else if (s[i] == '.'){    //存在'.'号,则'.'的前面一定存在数字,否则就是不合法

                if ((i == first_i) || (isdigit(s[i - 1])) || s[i - 1] == '+' || s[i - 1] == '-'){  //'.'在最前面或前面的字符是数字或+/-,则在该位置合法
                    dian_num++;
                    dian_pos = i;
                }
                else{          //其他条件均不合法
                    //break;
                    return false;
                }

                if (dian_num >1){   //'.'的数目不可能超多1,否则不合法
                    // break;
                    return false;
                }
            }
            else if (s[i] == 'e' || s[i] == 'E')   //存在e或E, e或E的前面一定是数字
            {

                if ((i != first_i) && (isdigit(s[i - 1]) || s[i - 1] == '.'))   //e的前面有数字则在该位置合法
                {
                    e_num++;
                    e_pos = i;
                }
                else{  //其他条件下均不合法
                    //break;
                    return false;
                }

                if (e_num >1){  //e或E的数目最多也只能为1
                    // break;
                    return false;
                }
            }
            else if (isdigit(s[i])){    //该字符是数字
                digit_num++;
            }
            else{  //既不是+或-号、也不是'.'、也不是e或E、更不是数字, 则该字符一定不合法
                //break;
                return false;
            }
        }//for

        //尽管在+或- 、'.'、e或E在相应坐标下符合,但不一定组合在一起就规范,比如+3.1e、1e+  2e-2.1 -3e+
        //发现,若存在在+或- 、'.'、e或E的话,则排序规则是 +/-(1)[xxx].x[xxx]e+/-(2)x[xx] ,其中x表示数字,[xx]表示有多位数字可选
        if (digit_num == (last_i - first_i)){ //全是数字
            return true;
        }
        if (digit_num == 0){
            return false;
        }
        //不全是数字的情况
        if ((last_i - first_i - digit_num) == 4)
        {    //4种符号都存在
            //第一:按照 +/-(1)x[xx].[xxxx]e+/-(2)x[xx] 或 +/-(1)[xxx].x[xxx]e+/-(2)x[xx] 的规则组成的合法排序
            if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 1) && (dian_pos - jia_jian_pos1 >= 2) && (jia_jian_pos1 == first_i) || ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 2) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i)))
            {
                return true;
            }
            else{
                return false;
            }
        }
        else if ((last_i - first_i - digit_num) == 3)
        {   //有一种符号不存在
            //第一:若+/1(1)不存在,则正确的排序是x[xx].x[xxx]e+/-(2)x[xx]
            if (jia_jian_num1 == 0)
            {
                //按照 [xxx].[xxxx]e+/-(2)x[xx] 的规则组成的合法排序
                if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 1) && (dian_pos - first_i >= 0))
                {
                    return true;
                }
                else{
                    return false;
                }
            }
            else if (jia_jian_num2 == 0)
            {
                //第二:若+/-(2)不存在,则正确的排序是+/-(1)[xxx].x[xxx]ex[xx]或+/-(1)x[xx].[xxx]ex[xx]
                if ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 2) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i) || ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 1) && (dian_pos - jia_jian_pos1 >= 2) && (jia_jian_pos1 == first_i)))
                {
                    return true;
                }
                else{
                    return false;
                }
            }
            else if (e_num == 0)
            {
                //第三:若e或E不存在,则+/-(2)一定不存在,所以该种情况不合法
                return false;
            }
            else
            {
                //第四:若'.‘不存在,则正确的排序是+/-(1)x[xxx]e+/-(2)x[xx]
                if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - jia_jian_pos1 >2) && (jia_jian_pos1 == first_i))
                {
                    return true;
                }
                else{
                    return false;
                }
            }
        }
        else if ((last_i - first_i - digit_num) == 2)   //2种符号不存在
        {
            //经分析,以下4中情况符合要求
            if ((jia_jian_num1 == 1) && (dian_num == 1)) //正确的排序规则: +/-(1)[xxx].x[xxx]
            {
                if ((last_i - 1 > e_pos) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if ((jia_jian_num1 == 1) && (e_num == 1))
            { //正确的排序规则:+/-(1)x[xxx]ex[xx]
                if ((last_i - 1 > e_pos) && (e_pos - jia_jian_pos1 >2) && (jia_jian_pos1 == first_i))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if ((dian_num == 1) && (e_num == 1))
            { //正确的排序规则:[xxx].x[xxx]ex[xx] 或 x[xx].[xxx]ex[xx]
                if (((last_i - 1 > e_pos) && (e_pos - dian_pos >= 2) && (dian_pos - first_i >= 0)) || ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 1) && (dian_pos - first_i >= 1)))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if ((e_num == 1) && (jia_jian_num2 == 1))
            { //正确的排序规则:x[xxx]e+/-(2)x[xx]
                if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos > first_i))
                {
                    return true;
                }
                else{
                    return false;
                }
            }
            else
            {
                return false;
            }

        }
        else if ((last_i - first_i - digit_num) == 1)
        { //3种符号不存在,则存在以下3中情形
            if (jia_jian_num1 == 1){ //形如+x[xx]
                if (s.length() >= 2){
                    return true;
                }
                else{
                    return false;
                }
            }
            else if (dian_num == 1){ //形如[xxx].x[xx]
                if (s.length() >= 2){
                    return true;
                }
                else{
                    return false;
                }
            }
            else if (e_num == 1){ //形如 x[xx]ex[xx]
                if (e_pos > first_i && e_pos < last_i - 1){
                    return true;
                }
                else{
                    return false;
                }
            }
            else{  //+/-(2)是不合法的
                return false;
            }

        }
        else
        {  //不存在符号,全是数字
            return true;
        }

    }
};

结果:
state: Accepted
runtime:12ms


我的思路:

  1. 既然是要符合规则,那么针对特定的符号,如+/-、e/E、.等只要满足它在其相应坐标位置符合规范,那么就可以考虑整体的规范性了。

  2. 考虑特定符号在其坐标位置的规范性,只需往前推理其处在这个位置是否合理即可,若连这个都无法满足,则完全可判定其不合格。

  3. 当局部满足要求时再判断整体组合是否满足要求即可。


我的总结:
虽然代码较长,但是运行时间却在意料之外。代码中有些判断条件其实是重复的,可以省略。网上有看到更优秀的代码,需学之~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值