表示数值的字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路:
我感觉我被牛客上的大佬虐打…
一、小白思路
一开始的想法是通过遍历字符串,验证不符合数值规范的情况,目前整理的情况有:
1、1a3 当字符串中出现除了e和E之外的单词时,返回false - OK
2、12e 在e或E后出现小数或没有数字时,即最后一个是e或E返回false; - OK
3、1.2.3 小数点个数超过两个,返回false -OK
4、±5 连续出现两个运算符,返回false -OK
5、e2 第一个就是e/E OK
6、123+3 +不在第一位且前面没有e/E OK
public class Solution {
public boolean isNumeric(char[] str) {
int point_num = 0;
if(str.length==0||str == null)
return false;
for(int i = 0; i < str.length;i++)
{
if(i == 0 && (str[i] == 'e'||str[i]=='E'))
return false;
if((i+1 <= str.length-1)&&(str[i] == '+'|| str[i] == '-')&&(str[i+1] == '+'|| str[i+1] == '-'))
{
return false;
}
if((i == str.length -1) &&(str[i]=='e'||str[i]=='E'))
{
return false;
}
if(str[i]=='.')
{
point_num ++;
}
if(point_num == 2)
{
return false;
}
if(Character.isLowerCase(str[i])|| Character.isUpperCase(str[i]))
{
if(str[i]!='e' && str[i] != 'E')
return false;
}
if((i-1)>0 && (str[i]=='+'||str[i]=='-')&& (str[i-1] != 'e' && str[i-1] != 'E'))
return false;
}
return true;
}
}
提交时,发现还是出错,case通过率为93.33%。用例:“12e+5.4” ,对应输出应该为false,我的输出为:true,没有将这种情况考虑进去,即e或E后面出现小数的情况。
由此可见,这种方案是万万不可的 。
其实还是有人实现的呀!不过要善于总结一哈
啊,思路超级清楚~我啥时候才能这么牛批
public class Solution {
public boolean isNumeric(char* str)
{
// 标记符号、小数点、e是否出现过
boolean sign = false, decimal = false, hasE = false;
for (int i = 0; i < str.length; i++) {
if (str[i] == 'e' || str[i] == 'E') {
//关于hasE会出现的错误,有两个,或在最后出现
if (i == str.length-1)
return false; // e后面一定要接数字,所以最后一个是E或e是不对的
if (hasE)
return false; // 不能同时存在两个e
hasE = true;
}
else if (str[i] == '+' || str[i] == '-')
{
//关于运算符,应该出现在开头或者e后面
// 第二次出现+-符号,则必须紧接在e之后
if (sign && str[i-1] != 'e' && str[i-1] != 'E')
return false;
// 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后
if