表示数值的字符串
表示数值的字符串
http://www.nowcoder.com/questionTerminal/e69148f8528c4039ad89bb2546fd4ff8
#include <vector>
#include <unordered_set>
class Solution {
public:
bool isNumeric(string str) {
// sign: 正负号 出现位置
// point:点 出现位置
// E: e 出现位置
// num: 数字出现位置
vector<int> sign,point,E;
// 为了方便查找,使用unordered_set
unordered_set<int> num;
int length = str.length();
for(int i=0;i<length;i++)
{
if(str[i]=='+'||str[i]=='-') sign.push_back(i);
else if(str[i]=='.') point.push_back(i);
else if(str[i]=='e'||str[i]=='E') E.push_back(i);
else if(str[i]<='9'&&str[i]>='0') num.insert(i);
else return false;
}
// 正负号 不多于2个;点 不多于1个;e 不多于1个;数字 不少于1个;
if(sign.size()>2||point.size()>1||E.size()>1||num.size()<1) return false;
// 当有两个+-时,必然一个在最前面,一个在e后面
// 当有一个+-时,必然在最前面,或在e后面
// 当有一个.时,.后必然有数字,.必在e前
// 当有一个e时,e前是数字,e后是数字或+-
bool bRet = true;
if(sign.size()==2) {
bRet = bRet && (sign[0]==0 && E.size()==1 && sign[1]==E[0]+1);
}
if(sign.size()==1) {
bRet = bRet && ( sign[0]==0 || (E.size()==1 && sign[0]==E[0]+1) );
}
if(point.size()==1) {
bRet = bRet && num.count(point[0]+1) && ( E.size()==0 || ( E.size()==1 && point[0]<E[0]) );
}
if(E.size()==1) {
bRet = bRet && num.count(E[0]-1) && ( num.count(E[0]+1) || (sign.size()==1 && E[0]+1==sign[0]) || (sign.size()==2 && E[0]+1==sign[1]) );
}
return bRet;
}
};