剑指offer刷题-表示数值的字符串

表示数值的字符串

题目描述

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

思路:
我感觉我被牛客上的大佬虐打…

一、小白思路

一开始的想法是通过遍历字符串,验证不符合数值规范的情况,目前整理的情况有:
1、1a3 当字符串中出现除了e和E之外的单词时,返回false - OK
2、12e 在e或E后出现小数或没有数字时,即最后一个是e或E返回false; - OK
3、1.2.3 小数点个数超过两个,返回false -OK
4、±5 连续出现两个运算符,返回false -OK
5、e2 第一个就是e/E OK
6、123+3 +不在第一位且前面没有e/E OK

public class Solution {
   
    public boolean isNumeric(char[] str) {
   
        int point_num = 0;
        if(str.length==0||str == null)
            return false;
        for(int i = 0; i < str.length;i++)
        {
   
            if(i == 0 && (str[i] == 'e'||str[i]=='E'))
                return false;
            if((i+1 <= str.length-1)&&(str[i] == '+'|| str[i] == '-')&&(str[i+1] == '+'|| str[i+1] == '-'))
            {
   
                return false;
            }
            if((i == str.length -1) &&(str[i]=='e'||str[i]=='E'))
            {
   
                return false;
            }
            if(str[i]=='.')
            {
   
                point_num ++;
            }
            if(point_num == 2)
            {
   
                return false;
            }
            if(Character.isLowerCase(str[i])|| Character.isUpperCase(str[i]))
            {
   
                if(str[i]!='e' && str[i] != 'E')
                    return false;                
            }            
            if((i-1)>0 && (str[i]=='+'||str[i]=='-')&& (str[i-1] != 'e' && str[i-1] != 'E'))
                return false;
        }
        return true;
    }
}

提交时,发现还是出错,case通过率为93.33%。用例:“12e+5.4” ,对应输出应该为false,我的输出为:true,没有将这种情况考虑进去,即e或E后面出现小数的情况。

由此可见,这种方案是万万不可的

其实还是有人实现的呀!不过要善于总结一哈

啊,思路超级清楚~我啥时候才能这么牛批

public class Solution {
   
	public boolean isNumeric(char* str) 
	{
           
		// 标记符号、小数点、e是否出现过        
		boolean sign = false, decimal = false, hasE = false;        
		for (int i = 0; i < str.length; i++) {
               
			if (str[i] == 'e' || str[i] == 'E') {
   
				//关于hasE会出现的错误,有两个,或在最后出现                
				if (i == str.length-1) 
					return false; // e后面一定要接数字,所以最后一个是E或e是不对的
				if (hasE) 
					return false;  // 不能同时存在两个e                    	            
				hasE = true;            
			} 
			else if (str[i] == '+' || str[i] == '-') 
			{
   
				//关于运算符,应该出现在开头或者e后面               	
				// 第二次出现+-符号,则必须紧接在e之后                
				if (sign && str[i-1] != 'e' && str[i-1] != 'E') 
					return false;                
				// 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后                
				if (!sign && i > 0 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值