考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默响起来一个声音:”乔戈里峰”
每天一道剑指offer-表示数值的字符串 https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路
代码
public class Solution {
public boolean isNumeric(char[] str) {
int index = 0;
if(str.length == 0)
return false;
if(str.length == 1 && (str[0] == '+' || str[0] == '-'))
return false;//只有一个正负号
if(str[0] == '+' || str[0] == '-')
index++;//跳过最开始的字符
index = judgeDigits(str,index);//跳过前面的数字
if(index == str.length)
return true;//如果正好遍历完,发现是到了字符串的长度,那么返回true。
if(str[index] == '.')
{//跳过数字以后,发现是个小数点
index++;//然后跳过小数点
if(index == str.length)
return false;//说明是1123. 这就不是合法数字
index = judgeDigits(str,index);//跳过接下来的所有数字
if(index == str.length)
return true;//如果恰好对于字符数组的长度,说明是123.432是规范数字
if(str[index] == 'e' || str[index] == 'E')
{//说明是1.4e10 这样类型的数字
index++;//把e跳过去
return judgeE(str,index);//判断是不是规范的带e的数字
}
return false;//返回假
}else if(str[index] == 'e' || str[index] == 'E')
{//说明可能是12e13 这样类型的数字
index++;//把e跳过去
return judgeE(str,index);//判断是不是规范的带e的数字
}
return false;
}
private boolean judgeE(char[] str,int index)
{
if(index >= str.length)
return false;
if(str[index] == '+' || str[index] == '-')
index++;//如果是符号则跳过 12e+12 这种可惜的数字
if(index >= str.length)
return false;//如果刚跳过e就到了字符串末尾 是12e就是不规范的
index = judgeDigits(str,index);//跳过全部的数字
if(index == str.length)//说明是12e23这样的数字是规范的
return true;
return false;
}
private int judgeDigits(char[] str,int index)
{
while(index < str.length)
{//判断是不是在0-9之间,不是的话就break返回index下标值
int number = str[index] - '0';
if(number <= 9 && number >= 0)
index++;
else{
break;
}
}
return index;
}
}