有效数字(表示数值的字符串),剑指offer,力扣

目录

题目地址:

我们直接看题解吧:

难度分析:

解题方法:

审题目+事例+提示:

解题思路:

代码实现:


题目地址:

LCR 138. 有效数字 - 力扣(LeetCode)

难度:中等

今天刷有效数字(表示数值的字符串),大家有兴趣可以点上看看题目要求,试着做一下

我们直接看题解吧:

难度分析:

这道题难倒是不算难,主要比较繁杂,因为要找出它的各种情况状态。

解题方法:

方法1、逐位判断(按顺序扫描字符串)

方法2、正则表达式(不太建议,面试用不上)

审题目+事例+提示:

1、本题即允许字符串首末两端有一些额外的空格

2、表示数值的字符串遵循共同的模式:

      A[.[B]][e|EC]或者.B[e|EC]。

    以上模式的含义是:

 A为数值的整数部分B为跟在小数点之后的小数部分C为跟在e或者E之后的指数部分

其中,A部分可以没有,比如小数.123代表0.123。但如果一个数没有整数部分,那么小数部分必须有

 具体来说:

   A和C(也就是整数部分和指数部分)都是可能以"+"、"-"开头或者没有符号的数字串,

  B是数字序列,但前面不能有符号。

解题思路:

1、设置三个boolean类型的变量,初始化为false

2、循环遍历字符串进行判断:

   ‘.出现的正确情况:只出现一次,且在e的前面

   ‘e出现的正确情况:只出现一次,且已经出现过有数字

   ‘+,-出现的正确情况:只能出现在开头即[0]或e的后一位

   符合条件的的字符重新置为true

3、返回对应的布尔值

代码实现:

class Solution {
    public boolean isNumber(String s) {
        if (s == null || s.length() == 0) return false; //首先判断字符串是否为空           
        s = s.trim();//去掉字符串两端的空格
        boolean numFlag = false;
        boolean dotFlag = false;  //设置三个变量,初始化false
        boolean eFlag = false;
        for (int i = 0; i < s.length(); i++) {
            //判定是否为数字,则标记numFlag
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                numFlag = true;
            }
          //判定是否为'.'  需要'.'没出现过.并且没出现过e
            else if (s.charAt(i) == '.' && !dotFlag && !eFlag) {
                dotFlag = true;
                
            } 
             //判定是否为e,需要没出现过e,并且出现过数字了
            else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {
                eFlag = true;
                numFlag = false;//为了避免123e这种情况,出现e之后就标志重置为false
             
            } 
           //判定为+-符号,只能出现在第一位或者紧接e后面
            else if ( (s.charAt(i) == '+' || s.charAt(i) == '-') {
                //+-出现在0位置或者e/E的后面第一个位置才是合法的
                if(i != 0 &&  s.charAt(i-1) != 'e' && s.charAt(i-1) != 'E'){
                    return false;
                }
            } 
           //其他情况,都是非法的
            else {
                return false;
            }
        }
        return numFlag;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值