
思路: 没啥特别的,就是把可能发生的情况都想一遍。。。这就是我一开始的思路。但是这样必然会少思考很多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的正则表达式,但是这种解决方法在面试中肯定是不行的,我也不知道为什么不行,但我就是觉得不行哈哈哈。
总结:
- string.contains(String s)这边参数只允许是String类型,不允许char类型。
- string.indexOf(String s/char c) 这边参数既可以是String类型,也可以是char类型。
本文深入探讨了LeetCode第65题“有效数字”的解决方案,分享了一种基于自动机DFA的有效方法,并对比了繁琐的手动实现过程,强调了代码可读性和逻辑严谨性的重要性。
3227

被折叠的 条评论
为什么被折叠?



