leetcode---65有效数字

距离上一次独立做出困难题已经好长时间了。。。今天虽然做出来了,但是是通过不断试错做出来的,自己考虑问题还是不够全面,以后还要加油,代码比较复杂,但思路很简单,有时间再优化以下吧。

65有效数字

在这里插入图片描述
不断的试错,不断的发现自己没考虑全面的地方。。。
在这里插入图片描述

思路

只需要注意以下各点,即可模拟检测过程:

  1. 字符串内只能存在以下字符+-.数字0-9eE
  2. 字符.e或E最多只能出现一次(最开始我只分析出.最多只能出现一次,没理解题意e或E也是最多只能出现一次,白给一次。。);
  3. 字符串中至少包含一个数字0-9
  4. 在满足上述条件的前提下,字符串的第一个字符不能是e或E
  5. 在满足上述条件的前提下,字符串的最后一个字符只能是.数字0-9(如9.是合法的,最开始没注意到,又白给一次。。);
  6. 因为最多只能出现一次e或E,所以在存在e或E时,e或E左边必须包含数字0-9,且e或E的右侧只能是整数(也就是说不能再出现.);
  7. 一些需要注意的点:
  8. +-后面只能是.数字0-9
  9. .后面只能是e或E数字0-9
  10. 数字0-9后面只能是e或E数字0-9.
  11. e或E后面只能是+-数字0-9.

算法步骤:

  1. 检查字符串内是否存在非法字符,存在则返回false;
  2. 检查字符串中的.数字0-9e或E的数量,不满足上述条件则返回false;
  3. 开始对字符串进行遍历,需要对以下情况进行判定:
  4. 存在e或E时,e或E左边必须包含数字0-9,且.只能在e或E的左边;
  5. +-后面只能是.数字0-9
  6. .后面只能是e或E数字0-9
  7. 数字0-9后面只能是e或E数字0-9.
  8. e或E后面只能是+-数字0-9.

代码

class Solution {
    public boolean isNumber(String s) {
        //存储合法字符
        Set<Character> set2 = new HashSet<>();

       
        set2.add('+');
        set2.add('-');
        set2.add('.');
        set2.add('e');
        set2.add('E');
        for (int i=0;i<=9;i++){
            char c = (char) ('0' + i);
            set2.add(c);
        }

        //检查是否存在非法字符、检查 ‘.’ 、‘数字0-9’、 ‘e或E’ 的数量
        int dot = 0;
        int eE = 0;
        int digit = 0;
        for (char i : s.toCharArray()){
            if (!set2.contains(i))
                return false;
            if (i>='0' && i<='9')
                digit++;
            if (i=='e' || i=='E')
                eE++;
            if (i=='.')
                dot++;
        }
        if (dot>1 || eE >1 || digit==0)
            return false;


        //检查开头的字符
        if (s.charAt(0)=='e' || s.charAt(0)=='E')
            return false;

        //检查结尾
        char ch1 = s.charAt(s.length()-1);
        if (ch1=='+' || ch1=='-' || ch1=='e' || ch1=='E')
            return false;

        //开始遍历
        //因为是从第二个开始遍历,先检查第一个字符的类型
        dot=0;
        if (s.charAt(0)=='.')
            dot=1;

        digit=0;
        if (s.charAt(0) >='0' && s.charAt(0)<='9')
            digit=1;

        for (int i=1;i<s.length();i++)
        {
            if (s.charAt(i) >='0' && s.charAt(i)<='9')
                digit=1;//标记e或E左边是否存在数字

            if (s.charAt(i) == 'e' || s.charAt(i)=='E'){
                dot = 1;//如果存在e或E,则其右侧不能出现‘.’
                if (digit==0)//如果e或E左边不存在数字
                    return false;
            }

            //如果出现了‘.’检查其是否合法
            if (s.charAt(i)=='.'){
                if (dot!=0)
                    return false;
                else
                    dot=1;
            }

            if (!checkNum(s,i))//检查是否满足8-11的要求
                return false;
        }

        return true;
    }
    public boolean checkNum(String s, int index){
        char b = s.charAt(index-1);
        char c = s.charAt(index);

        //一些判定规则
        if (b=='+' || b=='-')
        {
            if (c=='+' || c=='-' || c=='e' || c=='E')
                return false;
        }
        if (b=='.')
        {
            if (c=='+' || c=='-' || c=='.')
                return false;
        }
        if (b>='0' && b<='9')
        {
            if (c=='+' || c=='-')
                return false;
        }
        if (b=='e' || b=='E')
        {
            if (c=='e' || c=='E')
                return false;
        }
        
        return true;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值