表示数值的字符串

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

解法一:
找到字符’e’ 或者 ‘E’,把字符串分为两段,分别判断

  • 字符左边:满足要求(1)小数点只能出现一次 (2)加减号只能出现在最开始,且不能连着出现两个 (3)不能出现除数字、加减号、小数点以外的其它任何字符
  • 字符右边:满足要求(1)加减号只能出现在最开始且不能连续出现 (2)不能出现小数点 (3)不能出现除数字、加减号以外的其它任何字符
class Solution {
public:
	bool isNumeric(char* string)
	{
		if (*string == '\0')
			return false;

		int eIndex = 0;
		int eflag = 0;
		int opflag = 0;
		int puflag = 0;
		for (char *str = string; *str != '\0'; str++)
		{
			if (isalpha(*str))
			{
				if (*str == 'e' || *str == 'E')
				{
					eflag = 1;
					break;
				}
				else
					return false;
			}
			eIndex++;
		}

		if (eflag == 1)
		{
			if (eIndex == 0)
				return false;
			if (string[eIndex + 1] == '\0')
				return false;

			for (int i = 0; i < eIndex; i++)
			{
				//operator
				if (*string == '+' || *string == '-')
				{
					if (opflag == 0)
					{
						opflag = 1;
						string++;
					}
					else
						return false;
				}
				//number
				else if (isdigit(*string))
				{
					string++;
				}
				//dot
				else if (ispunct(*string))
				{
					if (*string != '.')
						return false;
					else
					{
						if (puflag != 0)
							return false;
						string++;
					}
				}
				opflag = 1;
			}

			string++;
		}

		opflag = 0;
		for (; *string != '\0'; string++)
		{
			if (isalpha(*string))
			{
				return false;
			}
			else if (*string == '+' || *string == '-')
			{
				if (opflag == 0)
				{
					opflag = 1;
				}
				else
					return false;
			}
			else if (isdigit(*string))
			{
				
			}
			else if (ispunct(*string))
			{
				if (eflag == 1 || *string != '.')
					return false;
			}
			opflag = 1;
		}
		return true;
	}
};

大家也能看到,里边有很多重复性的动作,所以我对代码进行了一下精简。

class Solution {
public:
    bool isNumeric(char* string)
    {
        if (*string == '\0')
            return false;
        
        int eflag = 0;
        int opflag = 0;
        int puflag = 0;
        
        if (*string == 'e' || *string == 'E')
            return false;
        for (; *string != '\0'; string++)
        {
            if (*string == '+' || *string == '-')
            {
                if (opflag)
                    return false;
            }
            
            else if (*string == 'e' || *string == 'E')
            {
                if (eflag || *(string + 1) == '\0')
                    return false;
                eflag = 1;
                opflag = 0;
                puflag = 1;
                continue; //这个continue一定要留着
            }
            
            else if (*string == '.')
            {
                if (puflag || eflag )
                    return false;
                else
                    puflag = 1;
            }
            
            else if (*string < '0' || *string > '9')
            {
                return false;
            }
                
            opflag = 1;
        }
        return true;
    }
};

看了牛客高赞解法,觉得大同小异,就不摘抄了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值