题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
分析
本题的主要解题思路如下:
- 首先判断字符串是否为空,或者首元素是否为‘.’,若是是则直接返回false;
- 否则,判断首元素是否为‘+’或者‘-’,若是则将循环变量赋值为i=1,否则则将循环变量赋值为i=0;
- 初始化flag=true,之后开始遍历整个字符串,若字符为大小写的字母(不包含‘e’和‘E’),则flag=false并终止遍历,
- 否则,若字符为‘+’或‘-’,则flag=false并终止遍历,若字符为‘0’到‘9’的数字,则接着遍历字符串,若字符为‘.’且第一次出现,小数点计数器cnt++,否则flag=false并终止遍历,若字符为‘E’或者‘e’,那么判断后面字符子串是否为数字,并结束遍历。
github链接:JZ53-表示数值的字符串
C++代码
#include <iostream>
#include <cstring>
using namespace std;
class Solution {
public:
bool check_science(char* str){
int length = strlen(str);
int j = 0;
if(str[0] == '+' || str[0]){
j = 1;
}
bool flag1 = true;
for(; j < length ; j++){
if(str[j] == '.' ){
flag1 = false;
break;
}else if((str[j] >= 'a' && str[j] <= 'z') ||
(str[j] >= 'A' && str[j] <= 'Z')){
flag1 = false;
break;
}else if(str[j] == '+' || str[j] == '-'){
flag1 = false;
break;
}else if(str[j] >= '0' || str[j] <= '9'){
continue;
}
}
return flag1;
}
bool isNumeric(char* string){
if(string == NULL || string[0] == '.'){
return false;
}
int len = strlen(string);
bool flag = true;
int cnt1 = 0; // 小数点个数
int i = 0; // 循环变量
if(string[0] == '+' || string[0] == '-'){
i = 1;
}
for(;i < len ; i++){
if(((string[i] >= 'a' && string[i] <='d')||(string[i] >= 'f' && string[i] <= 'z'))
|| ((string[i] >= 'A' && string[i] <='D')||(string[i] >= 'F' && string[i] <= 'Z'))){
flag = false;
break;
}else{
// 再次出现正负号
if((string[i] == '+' || string[i] == '-')){
flag = false;
break;
}else if(string[i] >= '0' && string[i] <= '9'){
continue;
}else if(string[i] == '.'){
if(cnt1 == 0){
cnt1++;
}else{
flag = false;
break;
}
}else if(string[i] == 'E' || string[i] =='e'){
if(i == len -1){ //‘E’或‘e’后面没有数字了
flag = false;
break;
}else{
flag = this->check_science(string+i+2);
break;
}
}
}
}
return flag;
}
};
int main()
{
string str;
Solution s;
while(cin>>str){
char* string = (char*) str.c_str();
cout<<s.isNumeric(string)<<endl;
}
return 0;
}