NC284. 表示数值的字符串
描述
示例1
输入:
"123.45e+6"
输出:
true
示例2
输入:
"1.2.3"
输出:
false
示例3
输入:
"."
输出:
false
示例4
输入:
" .2 "
输出:
true
C++ 解法, 执行用时: 2ms, 内存消耗: 404KB, 提交时间: 2021-08-17
class Solution { public: bool integer(string &str,int &i)//有符号整数判断 { if(str[i]=='-'||str[i]=='+') { ++i; } return unsigned_integer(str,i); } bool unsigned_integer(string &str,int &i)//无符号整数判断 { int temp=i; while(i<str.size()&&(str[i]>='0'&&str[i]<='9')) { ++i; } return i>temp; } bool isNumeric(string str) { if(str.size()==0){return false;} int i=0; int start=0; string str1=""; //去除前面空格 while(start<str.size()) { if(str[start]==' ')++start; else{ str1+=str[start]; ++start; } } //判断打头的字符是否有有符号整数 bool flag=integer(str1,i); //如果有小数点 if(str1[i]=='.') { ++i; //小数点前后至少有个整数 //判断小数点后是否有无符合整数 flag=unsigned_integer(str1,i)||flag; } //如果有e if(str1[i]=='e'||str1[i]=='E') { ++i; //e后面必须存在有符号整数 flag=integer(str1,i)&&flag; } return flag&&(i==str1.size()); } };
C++ 解法, 执行用时: 2ms, 内存消耗: 408KB, 提交时间: 2021-09-16
class Solution { public: bool isNumeric(string str) { if(str.empty()) return false; size_t nPos = 0; nPos = str.find(" ", nPos); while(nPos != string::npos){ str.replace(nPos, 1, ""); nPos = str.find(" ", nPos); } int index = 0; bool numeric = scanInteger(str, index); if(str[index]=='.') { ++index; numeric = scanUnsignedInteger(str,index) || numeric; } if(str[index] == 'e'|| str[index] == 'E') { ++index; numeric = scanInteger(str,index) && numeric; } return numeric && (index == str.size()); } bool scanInteger(string & str, int & index) { if(str[index] == '+' || str[index]== '-') ++index; return scanUnsignedInteger(str, index); } bool scanUnsignedInteger(string & str, int & index) { int begin = index; while(str[index] != '\0' && str[index] >= '0' && str[index] <= '9') ++index; return index > begin; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 412KB, 提交时间: 2021-10-08
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ bool isNumeric(string str) { // write code here trim(str); bool showNum = false; bool showDot = false; bool showE = false; for(int i = 0; i < str.length(); ++i) { char c = str[i]; if(c - '0' >= 0 && c - '0' <= 9) { showNum = true; }else if(c == 'e' || c == 'E') { if(showE || !showNum) { return false; } showE = true; showNum = false; }else if(c == '.') { if(showDot || showE) { return false; } showDot = true; }else if(c == '-' || c == '+') { if(i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E') { return false; } }else { return false; } } return showNum; } void trim(string& str) { str.erase(0, str.find_first_not_of(" ")); str.erase(str.find_last_not_of(" ") + 1); } };
C++ 解法, 执行用时: 2ms, 内存消耗: 412KB, 提交时间: 2021-09-09
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ //bool isNumeric(string str) { // write code here //方法一:硬写 /*if(str.length()==0){ return false; } if(str.length()==1&&((str[0]=='+')||(str[0]=='-')||(str[0]=='.')||(str[0]==' '))){ return false; } int j=0; for(;j<str.length();){ if(str[j]==' '){ ++j; } else if(str[j]=='e'||str[j]=='E'){ return false; } else if(str[j]=='+'||str[j]=='-'){ if(j+1<str.length()&&(str[j+1]>'0'&&str[j+1]<'9'||str[j+1]=='.')){ j=j+1; break; } else{ return false; } } else{ break; } } int sym1=0; int sym2=0; int sym3=0; for(int i=j;i<str.length();){ if(str[i]!=' '&&str[i]!='.'&&str[i]!='+'&&str[i]!='-'&&str[i]!='E'&&str[i]!='e'){ if(str[i]<'0'||str[i]>'9'){ return false; } i++; } if(str[i]=='.'){ sym1++; if(sym1>1||sym2==1||sym3==1){ return false; } if(i+1>str.length()-1){ if(str[i-1]<'9'&&str[i-1]>'0'){ return true; } else{ return false; } } if((str[i+1]<'0'||str[i+1]>'9')&&str[i+1]!='e'&&str[i+1]!='E'){ return false; } i++; } if(str[i]=='E'||str[i]=='e'){ sym2++; if(i+1>str.length()-1){ return false; } if((str[i+1]<'0'||str[i+1]>'9')&&str[i+1]!='+'&&str[i+1]!='-'){ return false; } if(sym2>1||sym3==1){ return false; } i++; } if(str[i]=='+'||str[i]=='-'){ sym3++; if(i+1>str.length()-1){ return false; } if(str[i+1]<'0'||str[i+1]>'9'){ return false; } if(sym3>1||sym2==0){ return false; } i++; } if(str[i]==' '){ while(i<str.length()){ if(str[i]!=' '){ return false; } i++; } } } return true;*/ //方法二:正则表达式 /*if(str.empty()) return false; size_t index=0; if(str.length()==1){ return scanInteger(str, index); } bool numeric=scanInteger(str, index); if(index+1<str.length() && str[index]=='.'){ ++index; bool hasNumber=scanUnsignedInteger(str, index); numeric=hasNumber||numeric; } if(index+1<str.length()&&(str[index]=='e'||str[index]=='E')){ ++index; numeric=numeric&&scanInteger(str, index); } return numeric && (index==str.length()); } bool scanUnsignedInteger(string& str,size_t& index){ size_t begin=index; while(index<str.length()&&str[index]>='0'&&str[index]<='9'){ ++index; } return index>begin; } bool scanInteger(string& str,size_t& index){ if(str[index]=='+'||str[index]=='-'){ ++index; } return scanUnsignedInteger(str, index); }*/ bool isNumeric(string str){ if(str.empty()){ return false; } size_t index=0; if(str.length()==1){ return scanUnsignedInteger(str, index); } while(index<str.length() && str[index]==' '){ ++index; } bool numeric=scanInteger(str, index); if(str[index]=='.'){ ++index; numeric=scanUnsignedInteger(str, index)||numeric; } if(str[index]=='e'||str[index]=='E'){ ++index; numeric=numeric && scanInteger(str,index); } while(index<str.length() && str[index]==' '){ ++index; } return numeric&&(index==str.length()); } bool scanInteger(string& str,size_t& index){ if(str[index]=='+'||str[index]=='-'){ ++index; } return scanUnsignedInteger(str,index); } bool scanUnsignedInteger(string& str,size_t& index){ size_t begin=index; while(index<str.length()&&str[index]>='0'&&str[index]<='9'){ ++index; } return index>begin; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 412KB, 提交时间: 2021-09-06
class Solution { public: bool isNumeric(string str) { // 空格 - ' ' 数字 - 'd' e/E - 'e' +/- - 's' // 0 1 2 3 4 5 6 7 8 9 // (空格)(+/-)(数字)(.)|(数字 .)|(数字)(e/E)(+/-)(数字)(空格) // 状态 0 // - 空格 至 0 // - +-号 至 1 // - 数字 至 2 // - . 至 3 unordered_map<char, int> state_0; state_0.insert({' ', 0}); state_0.insert({'s', 1}); state_0.insert({'d', 2}); state_0.insert({'.', 3}); // 状态 1 // - 数字 至 2 // - . 至 3 unordered_map<char, int> state_1; state_1.insert({'d', 2}); state_1.insert({'.', 3}); // 状态 2 ok // - 数字 至2 // - . 至4 // - e 至6 // - 空格 至9 unordered_map<char, int> state_2; state_2.insert({'d', 2}); state_2.insert({'.', 4}); state_2.insert({'e', 6}); state_2.insert({' ', 9}); // 状态 3 // - 数字 至5 unordered_map<char, int> state_3; state_3.insert({'d', 5}); // 状态 4 ok // - 数字 至5 // - e 至6 // - 空格 至9 unordered_map<char, int> state_4; state_4.insert({'d', 5}); state_4.insert({'e', 6}); state_4.insert({' ', 9}); // 状态 5 ok // 数字 至5 // - e 至6 // - 空格 至9 unordered_map<char, int> state_5; state_5.insert({'d', 5}); state_5.insert({'e', 6}); state_5.insert({' ', 9}); // 状态 6 // - +-号 至7 // - 数字 至8 unordered_map<char, int> state_6; state_6.insert({'s', 7}); state_6.insert({'d', 8}); // 状态 7 // - 数字 至8 unordered_map<char, int> state_7; state_7.insert({'d', 8}); // 状态 8 ok // - 数字 至8 // - 空格 至9 unordered_map<char, int> state_8; state_8.insert({'d', 8}); state_8.insert({' ', 9}); // 状态 9 ok // - 空格 至9 unordered_map<char, int> state_9; state_9.insert({' ', 9}); int stateIndex = 0, curChar; unordered_map<char, int> state[] = {state_0, state_1, state_2, state_3, state_4, state_5, state_6, state_7, state_8, state_9}; for (char ch: str) { if (ch == ' ') { curChar = ' '; } else if (ch == '.') { curChar = '.'; } else if (ch == '+' || ch == '-') { curChar = 's'; } else if (ch == 'e' || ch == 'E') { curChar = 'e'; } else if (ch <= '9' && ch >='0') { curChar = 'd'; } else { curChar = '?'; } auto nextStatePtr = state[stateIndex].find(curChar); if (nextStatePtr == state[stateIndex].end()) { return false; } else { stateIndex = nextStatePtr->second; } } array<int, 5> caseOK{2, 4, 5, 8, 9}; if (find(caseOK.begin(), caseOK.end(), stateIndex) != caseOK.end()) return true; else return false; } };