写三个方法分别判断是否表示整数、小数以及科学计数法。
其中,判断小数的方法中调用判断整数的方法协助判断,判断科学计数法的方法中调用判断小数以及判断整数的方法协助判断。达到代码复用的目的。
总体来说没有技术难点,就是string.substr()这个方法有个小坑。两个参数,第一个为截取的起点下标,第二个为要截取的元素个数。最开始将其与js中的substr混淆,使用了第一个为起点下标,第二个为终点下标的写法。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return bool布尔型
*/
bool isNumeric(string str) {
// write code here
if(str.empty()){
return false;
}
return isInt(str) || isDec(str) || isSci(str);
}
bool isInt(string str){
if(str.empty()){
return false;
}
int i = 0;
while(str[i] == ' '){
++i;
}
if(!passedASign && (str[i] == '+' || str[i] == '-')){
++i;
}
else if(passedASign){
passedASign = false;
}
do{
if(str[i] - '0' < 0 || str[i] - '0' > 9 || i > str.size() - 1){
return false;
}
++i;
} while(str[i] != ' ' && str[i] != EOF && str[i] != '\000');
return true;
}
bool isDec(string str){
if(str.empty()){
return false;
}
int i = 0;
while(str[i] == ' '){
++i;
}
int first = i;
if(str[first] == '+' || str[first] == '-'){
++first;
passedASign = true;
}
if(first > str.size() - 1){
return false;
}
while(str[i] != '.' && i < str.size() && str[i] != '\000'){
i++;
}
int dot = i;
if(dot == first){
int s = i + 1;
string sub = str.substr(s,str.size() - s);
if(isInt(sub)){
return true;
}
else{
return false;
}
}
string front = str.substr(first,dot);
if(i + 1 < str.size() && str[i + 1] != ' '){
string rear = str.substr(i + 1, str.size() - i - 1);
return isInt(front) && isInt(rear);
}
else{
return isInt(front);
}
return true;
}
bool isSci(string str){
int i = 0;
bool firstE = true;
while(str[i] == ' '){
++i;
}
int start = i;
while(i < str.size() && str[i] != 'e' && str[i] != 'E'){
i++;
}
int end = i;
string front = str.substr(start,end - start);
if(isInt(front) || isDec(front)){
i++;
int ns = i;
while(i < str.size() && str[i] != ' '){
i++;
}
int ne = i;
string rear = str.substr(ns,ne - ns);
if(ne == ns){
return false;
}
else if(isInt(rear) || isDec(rear)){
return true;
}
else{
return false;
}
}
else{
return false;
}
}
private:
bool passedASign = false;
};