Leetcode 65 Valid Number

本文深入探讨了LeetCode第65题“有效数字”的解决方案,分享了一种基于自动机DFA的有效方法,并对比了繁琐的手动实现过程,强调了代码可读性和逻辑严谨性的重要性。

在这里插入图片描述
思路: 没啥特别的,就是把可能发生的情况都想一遍。。。这就是我一开始的思路。但是这样必然会少思考很多weird的case。所以这也是我后期疯狂debug的原因。最后的代码也是惨不忍睹,可读性几乎为0。我之所以硬着头皮把这题做出来了,原因很简单,我只是单纯的不想放弃一道题,哪怕再烦,我就当练习敲代码的感觉也好,做一做总归没错的。你看我这一做,就发现自己的逻辑是多么的不严谨,导致疯狂debug,最后的代码可读性为0。下面我直接放我的代码,非常的差,大家看看也就图一乐。

class Solution {
    public boolean isNumber(String s) {
        s = s.trim();
        if(s.equals(".")){return false;}
        if(s.indexOf('.') != s.lastIndexOf('.')){return false;}
        if(s.equals("") || s.equals(" ")){return false;}
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if((int)c == 43 || (int)c == 45 || (int)c == 46 || (int)c == 48 || (int)c == 49 || (int)c == 50 || (int)c == 51 || (int)c == 52 || (int)c == 53 || (int)c == 54 || (int)c == 55 || (int)c == 56 || (int)c == 57 || (int)c == 46 || (int)c == 101){continue;}else{
                return false;
            }
        }
        if(!s.contains("e")){
            if(s.charAt(0) == '+' || s.charAt(0) == '-'){
                
                String str = s.substring(1);
                if(str.contains("+") || str.contains("-")){return false;}
                if(s.length() == 2 && s.charAt(1) == '.'){return false;}
                if(s.charAt(s.length() - 1) == '.'){return true;}
                if(s.indexOf(s.charAt(0)) == s.lastIndexOf(s.charAt(0))){
                   if(s.indexOf('.') == -1){
                       return true;
                   }else{
                       if(s.indexOf('.') != s.lastIndexOf('.')){return false;}
                       if(s.indexOf('.') == s.length() -1){return false;}
                       else{return true;}
                   }
                }else{return false;}
            }else {
                
                String st = s.substring(1);
                if(st.contains("+") || st.contains("-")){return false;}
                if(s.charAt(s.length() - 1) == '.'){return true;}
                if(s.indexOf('.') == -1){
                    return true;
                }else{
                    if(s.indexOf('.') != s.lastIndexOf('.')){return false;}
                    if(s.indexOf('.') == s.length() -1){return false;}
                    else{return true;}
                }
            }   
        }
        if(s.indexOf('e') == s.lastIndexOf('e')){
            int idx = s.indexOf('e');
            if(idx == s.length() - 1 || idx == 0){return false;}
            if(idx == 0){return false;}
            String f = s.substring(0,idx);
            String b = s.substring(idx+1);
            if(f.equals(".")){return false;}
            if(f.charAt(0) == '+' || f.charAt(0) == '-'){
                if(f.length() == 1){
                    if(f.equals("+") || f.equals("-")){return false;}
                }
                String n = f.substring(1);
                if(n.contains("+") || n.contains("-")){return false;}
                if(f.charAt(f.length() - 1) == '.'){return true;}
                if(f.indexOf(s.charAt(0)) == f.lastIndexOf(s.charAt(0))){
                   if(f.indexOf('.') != -1){  
                       if(f.indexOf('.') != f.lastIndexOf('.')){return false;} 
                       if(f.indexOf('.') == f.length() -1){return false;}
                   }
                }else{return false;}
            }else{
                String m = f.substring(1);
                if(m.contains("+") || m.contains("-")){return false;}
                if(f.charAt(f.length() - 1) == '.'){return true;}
                if(f.indexOf('.') != -1){
                    if(f.indexOf('.') != f.lastIndexOf('.')){return false;}
                    if(f.indexOf('.') == f.length() -1){return false;}
                }
            }
            if(b.charAt(0) == '+' || b.charAt(0) == '-'){
                if(b.indexOf(b.charAt(0)) == b.lastIndexOf(b.charAt(0))){
                    if(b.length() == 1){return false;}
                    String r = b.substring(1);
                    if(r.contains("+") || r.contains("-")){return false;}
                    if(b.contains(".")){return false;}
                    return true;
                }else{return false;}
            }else{
                if(b.length() > 1){
                    if(b.substring(1).contains("+")||b.substring(1).contains("-")){return false;}
                }
                return !b.contains(".");
            }
        }else{return false;}  
    }
}

接下来我要介绍一个很好的方法:自动机DFA。这是我看别人的解法学来的,非常的好。这边我直接放他的这道题的链接:https://leetcode.wang/leetCode-65-Valid-Number.html 真的是非常好的解决此题的方法,建议去看看。另外的关于这题还可以写出valid expression的正则表达式,但是这种解决方法在面试中肯定是不行的,我也不知道为什么不行,但我就是觉得不行哈哈哈。

总结:

  1. string.contains(String s)这边参数只允许是String类型,不允许char类型。
  2. string.indexOf(String s/char c) 这边参数既可以是String类型,也可以是char类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值