您的位置:首页 > 其它

leetcode-65-Valid Number

2016-03-04 21:27 501 查看
#include <iostream>
#include <string>
using namespace std;
/*
判断合法数字。
有三种合法数字:(正、负)
1. 整数
2. 小数 .5也算合法 小数点的前面不能有小数点和e    3.也算合法。。。
3. 指数 2e+20算不算合法 2e(10+5)应该没有那么复杂  2.5e19也是合法的 e之前可以有小数点,但是不能有e
允许前后有空格。
*/
class Solution {
public:
bool isNumber(string s) {
int len = int(s.length());
int i = 0;
bool isFloat = false, isExp = false;
//开头有空格
while (s[i] == ' ') {
i++;
}
//不是数字开头
if (s[i] < '0' || s[i] > '9') {
//开头可以是小数点
if (s[i] == '.') {
//不过要注意不能同时是结尾 .   +
if (i == len - 1) {
return false;
}
//".e1"不能直接接着e
isFloat = true;
} else {
//正负符号
if (s[i] != '+' && s[i] != '-') {
return false;
}
}
}
i++;
while (i < len) {
//判断不是数字的情况,指数或小数
if (s[i] < '0' || s[i] > '9') {
//非法字符
if (s[i] != '.' && s[i] != 'e') {
//正负号的前一个一定是e
if (s[i] == '+' || s[i] == '-') {
if (s[i - 1] != 'e') {
return false;
}
//正负号不能在结尾
if (i == len -1) {
return false;
}
} else if (s[i] == ' ') {   //结尾都是空格也合法
int j = i + 1;
while (j < len) {
if (s[j] != ' ') {
return false;
}
j++;
}
//但是前面不是数字的就不行 10e这种算不算合法
if (s[i - 1] == 'e') {
return false;
}
//只有小数点和空格的也不行
if (i == 1 && s[0] == '.') {
return false;
}
return true;
} else {
return false;
}
} else if (s[i] == '.') {   //小数点
//小数点前面有小数点或e
if (isFloat || isExp) {
r
97fa
eturn false;
}
//至少有一边是数字
if (s[i - 1] < '0' || s[i - 1] > '9') {
if (i < len - 1) {
if (s[i + 1] < '0' || s[i + 1] > '9') {
return false;
}
} else {
return false;
}
}
isFloat = true;
} else {    //e
//e在结尾 或 e前面有e ".e58" e前面没有数字
if (i == len - 1 || isExp || (i == 1 && (s[0] < '0' || s[0] > '9'))) {
return false;
}
isExp = true;
}
}
i++;
}
return true;
}
};
int main(int argc, const char * argv[]) {
Solution s;
string test = " 4e+";
cout << s.isNumber(test) << endl;
return 0;
}
暂时显得有点乱,待改写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: