有效数字(按顺序)可以分成以下几个部分:
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')
至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。示例 1:
输入:s = "0"
输出:true
示例 2:输入:s = "e"
输出:false
示例 3:输入:s = "."
输出:false
示例 4:输入:s = ".1"
输出:true
提示:
1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,或者点 '.' 。
package LeetCode.ValidDigit;
import java.util.Scanner;
public class LIKou {
public static void main(String[] args) {
Solution solution=new Solution();
Scanner scanner=new Scanner(System.in);
String s=scanner.next();
System.out.println(solution.isNumber(s));
}
}
class Solution {
public boolean isNumber(String s) {
int i=0;
//先说一下judge方法,它的功能是判断字符串是小数(返回1),整数(返回0),其它(返回>1的数)
//用i遍历字符串s,先查看字符串中有没有e(E),如果有e(E),就对e(E)前后的字符串调用judge方法
//满足e后为0,前小于2,则满足题意。
while(i<s.length()){
if(isEle(s.charAt(i))){
if(i==s.length()-1){
return false;
}
if(judge(s.substring(i+1))==0&&i>0&&(judge(s.substring(0,i))<2)){
return true;
}
}
i++;
}
//如果式子中没有e,则判断s是否为整数或小数
if (judge(s)<2){
return true;
}
return false;
}
//判断c是否为+/-
public static boolean isOpe(char c){
return c=='+'||c=='-';
}
//判断c是否为E/e
public static boolean isEle(char c){
return c=='E'||c=='e';
}
//判断是否整数/小数/都不是
//分别返回0/1/其他
/*主要思路是:先考虑正负号,有的话,判断是否只有正负号,只有就返回2
判断玩正负号后,有4中情况:
只有
.数字
数字
数字.
数字.数字
先讨论第一个为.后面如果不是有且只有数字,就返回2
后三种情况,就遍历一遍,有除了.数字的符号就返回2
用flag标记,有几个点就返回几。
*/
public static int judge(String s){
int i=0;
if(isOpe(s.charAt(i))){
i++;
if(s.length()==i){
return 2;
}
}
if(s.charAt(i)=='.'){
i++;
if(i==s.length()){
return 2;
}
while(i<s.length()){
if(!Character.isDigit(s.charAt(i))){
return 2;
}
i++;
}
return 1;
}else if(Character.isDigit(s.charAt(i++))){
int flag=0;
while(i<s.length()){
if(Character.isDigit(s.charAt(i))){
i++;
continue;
}else if(s.charAt(i)=='.'){
i++;
flag++;
continue;
}
return 2;
}
return flag;
}
return 2;
}
}
如有优化建议和问题,欢迎评论区讨论。
来源:力扣(LeetCode)