leetcode 65. Valid Number

本文介绍了一种判断给定字符串是否为有效数值的方法。通过解析和检查输入字符串中的字符,该方法能够正确识别整数、小数、科学计数法表示的数字等。文中详细解释了实现过程中的关键步骤。

65. Valid Number

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

class Solution {
public:
    bool isNumber(string s) 
    {
        int k = 0;
        while (1) //先去除开头的空格
        {
            if(s[k] == ' ')
                s = s.substr(1, s.size()-1);
            else
                break;
        }
        if(s.size() == 0)
            return 0;
        
        while(1) //去除末尾的空格
        {
            k = s.size()-1;
            if(s[k]==' ')
                s = s.substr(0, s.size()-1);
            else
                break;
        }
    
        k = 0;   
        int flag = 0;   //记录有没有 '.'
        int flag3 = 0;  //记录有没有 '-' 或者 '+'
        int flag4 = 0;  //记录有没有 'e'
        while (k < s.size())
        {
            if(int(s[k]) >= 48 && int(s[k]) <= 57)   // 0 - 9
            {
                k++;   
                continue; 
            }
            else if(int(s[k]) == 46 && flag == 0 && flag4 == 0)  // '.'
            {
                flag = 1;
                if (k == 0 && s.size() == 1)//  排除"." 
                    return 0;
                else if(k != 0 && k < s.size() - 2 && s[k+1] == 'e')   //  "14.e3" true
                {
                    k++;   
                    continue;
                }
                else if (k != s.size() - 1 && (int(s[k+1]) < 48 || int(s[k+1]) > 57)) // '.'后面是非法的字母等
                    return 0;   
                else if (k == s.size() - 1 && s[k-1] == '-' && k > 0)  // 排除 "-."
                    return 0;
                else
                {
                    k++;   
                    continue;
                }
            }
            else if (int(s[k]) == 101 && k != 0 && k != s.size() - 1 && s[k+1] != '.' && flag4 == 0)  // 'e'
            {
                flag4 = 1;
                if (k == 1 && (int(s[k-1]) < 48 || int(s[k-1]) > 57)) //'e'之前的非法字母
                    return 0;
                else
                {
                    k++;   
                    continue; 
                }
            }
            else if (int(s[k]) == 45)  // -
            { 
                if (flag3 == 0 || (k > 0 && s[k-1] == 'e'))     //只有 "-23" 或者 "2e-3" 才可以
                {  
                    flag3 = 1;
                    if((s[k-1] == 'e' && k != s.size()-1) || (k == 0 && s.size() != 1))  // 排除"2e-" 
                    { 
                        k++;   
                        continue;
                    }
                    else
                        return 0;
                }
                else
                    return 0;
            }
            else if (int(s[k]) == 43 && k != s.size()-1)    //+
            {
                if (flag3 == 0 || (k > 0 && s[k-1] == 'e'))  //只有 "+23" 或者 "2e+3" 才可以
                {
                    flag3=1;
                    if(s[k+1] == '.' && k + 1 != s.size()-1)      // "+.3" true
                    {
                        k++;   
                        continue;  
                    }
                    else if(k == 0)
                    {
                        k++;   
                        continue;  
                    }
                    else if(k != 0 && s[k-1] == 'e' && k != s.size() - 1)
                    {
                        k++;   
                        continue;  
                    }
                    else
                        return 0;
                }
                else
                    return 0;
            }
            else
                return 0;
        }
        return 1;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值