Valid Number
Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
Java代码: public class Solution {
public boolean isNumber(String s) {
boolean flag_Dot = false;
boolean flag_e = false;
boolean flag_num = false;
boolean flag_num_2 =false;
boolean flag_1 = false;
int num_begin =0;
int num_end =0;
int space_index =0;
int space_index_start =0;
int e_index =0;
int dot_index =0;
int i =0;
int len = s.length();
if(s.charAt(0) =='-' ||s.charAt(0) =='+'){i=1;num_begin =1;num_end =1;}
for(;i<len;i++)
{
if(s.charAt(i)<'0' || s.charAt(i)>'9')
{
if(s.charAt(i) == ' ') {if(i>num_begin && flag_num_2 ==true)space_index =i;
if(flag_Dot==true )space_index=i;
if(space_index!=0 &&space_index_start==0)space_index_start=space_index;
if(flag_num_2==false && (s.charAt(0) =='-' ||s.charAt(0) =='+'))return false;
continue; }
if(s.charAt(i) =='.' ||s.charAt(i) =='e' ||s.charAt(i) == 'E')
{
if(len ==1 ) return false;
if(i ==0 &&(s.charAt(i) =='e' ||s.charAt(i) == 'E')) return false;
if(s.charAt(i) == '.')
if(flag_Dot == false)
{
if(space_index<i && space_index!=0)return false;
dot_index =i;
flag_Dot = true;
}
else
return false;
else{
if(flag_e == false)
{
e_index=i;
for(int j =0;j<i;j++)
{
if(s.charAt(j)>='0' &&s.charAt(j)<='9')
flag_1 = true;
}
for(int j= i;j<len;j++){
if(s.charAt(j) == '.')return false;
}
if(flag_1 ==false) return false;
if(len == i+1) return false;
flag_e = true;
}
else
return false;
}
}else
return false;
}
else{
if(flag_num_2 ==false){num_begin =i;flag_num_2 = true;}
if(i>num_end)num_end =i;
flag_num = true;
}
}
if(space_index_start<num_end &&space_index !=0 &&num_begin!=num_end)return false;
if(flag_Dot==true)
{
if(space_index>dot_index && space_index<num_end)return false;
if(space_index>dot_index && space_index_start<num_end &&space_index_start!=0)return false;
}
if(e_index > num_end)return false;
if(flag_num == false) return false;
return true;
}
}
上面是考虑穷举不成立的条件,穷举了一个上午,还是没有pass。。。
public class Solution {
public boolean isNumber(String s) {
boolean flag_Dot = false;
boolean flag_e = false;
boolean flag_num = false;
boolean flag_num_2 =false;
boolean flag_1 = false;
int num_begin =0;
int num_end =0;
int space_index =0;
int space_index_start =0;
int e_index =0;
int dot_index =0;
int i =0;
int len = s.length();
if(s.charAt(0) =='-' ||s.charAt(0) =='+'){i=1;num_begin =1;num_end =1;}
for(;i<len;i++)
{
if(s.charAt(i)<'0' || s.charAt(i)>'9')
{
if(s.charAt(i) == ' ') {if(i>num_begin && flag_num_2 ==true)space_index =i;
if(flag_Dot==true )space_index=i;
if(space_index!=0 &&space_index_start==0)space_index_start=space_index;
if(flag_num_2==false && (s.charAt(0) =='-' ||s.charAt(0) =='+'))return false;
continue; }
if(s.charAt(i) =='.' ||s.charAt(i) =='e' ||s.charAt(i) == 'E')
{
if(len ==1 ) return false;
if(i ==0 &&(s.charAt(i) =='e' ||s.charAt(i) == 'E')) return false;
if(s.charAt(i) == '.')
if(flag_Dot == false)
{
if(space_index<i && space_index!=0)return false;
dot_index =i;
flag_Dot = true;
}
else
return false;
else{
if(flag_e == false)
{
e_index=i;
for(int j =0;j<i;j++)
{
if(s.charAt(j)>='0' &&s.charAt(j)<='9')
flag_1 = true;
}
for(int j= i;j<len;j++){
if(s.charAt(j) == '.')return false;
}
if(flag_1 ==false) return false;
if(len == i+1) return false;
flag_e = true;
}
else
return false;
}
}else
return false;
}
else{
if(flag_num_2 ==false){num_begin =i;flag_num_2 = true;}
if(i>num_end)num_end =i;
flag_num = true;
}
}
if(space_index_start<num_end &&space_index !=0 &&num_begin!=num_end)return false;
if(flag_Dot==true)
{
if(space_index>dot_index && space_index<num_end)return false;
if(space_index>dot_index && space_index_start<num_end &&space_index_start!=0)return false;
}
if(e_index > num_end)return false;
if(flag_num == false) return false;
return true;
}
}
代码的逻辑都已经凌乱了,已经没有毅力坚持了。。
现在意识到方法肯定不对,网上搜了,发现是用正则来做的。。
Java代码:
public class Solution {
public boolean isNumber(String s) {
if(s.trim().isEmpty()){
return false;
}
String regex = "[-+]?(\\d+\\.?|\\.\\d+)\\d*(e[-+]?\\d+)?";
if(s.trim().matches(regex)){
return true;
}else{
return false;
}
}
}
我错误地估计了leetcode测试集合的规模。。。
public class Solution {
public boolean isNumber(String s) {
if(s.trim().isEmpty()){
return false;
}
String regex = "[-+]?(\\d+\\.?|\\.\\d+)\\d*(e[-+]?\\d+)?";
if(s.trim().matches(regex)){
return true;
}else{
return false;
}
}
}