Leetcod第65题有效数字(valid number)的一些注意事项

原题如下

验证给定的字符串是否为数字。

例如:
“0” => true
” 0.1 ” => true
“abc” => false
“1 a” => false
“2e10” => true
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。

说实话我真的是感觉出这题的人是NC,需要控制的地方太多了,主要是考逻辑思维。看到通过率10%左右,所以就想着提供一下注意事项,及自己的烂代码

此题需要注意以下几点

1.e最多只能有一个;
2.如果没有e的话(有一个e的时候 可以把以e为中间元素进行划分 左边 string left 右边string right 单独来看就是没有e的存在了,因为e最多一个 例如 s=“+10e2” left=“+10”right=“2”):
这个时候 + 或 - 最多只能有一个!!!!而且 必须在 s的首部;
3.中间部分不能有空格(两边的空格可以提前给删除掉) 否则直接 return false
4.小数点只能有1个 且只能在e的前面(如果在e的后面是错误的)
5.而且 小数点的前或者后可以没有数字(但是不能同时没有,必须要有一个)
注意 +.e2 是错误的
而 +.1e2 或者 +1.e2是正确的
6.+ 或 - 一共加起来可以有两个 (有两个的前提是有e 的存在 ps:这时候也就是上面2的括号内的情况 而且此时+ -分别在e的两边)
——-> 所以你需要知道 ’ e ’ ’ . ’ ’ + ’ ’ - ’ 的position 和他们的个数?

代码如下(真的是仅供参考。。。有些判断语句可以去掉,因为他给的测试数据中并不全面 )

class Solution {
public:
void qiege_space(string &s){
        if (s.size() > 0){
            for (int i = 0; i <= s.size() - 1;){
                if (s[i] == ' ') s.erase(i, 1);
                else break;
            }
            for (int j = s.size() - 1; j >= 0; j--){
                if (s[j] == ' ') s.erase(j, 1);
                else break;
            }
        }
    }
bool isNumber(string s) {
        qiege_space(s);
        if (s.size() <= 0) return false;
        for (int i = 0; i <= s.size() - 1; i++){
            if (s[i] == ' ') return false;
        }
        vector<int> point, e, other, minus_sign, jiahao, count;
        for (int i = 0; i <= s.size() - 1; i++){
            if (s[i] == '.') point.push_back(i);
            if (s[i] == 'e') e.push_back(i);
            if (s[i] == '-') minus_sign.push_back(i);
            if (s[i] == '+')jiahao.push_back(i);
            int tmp = (int)s[i] - 48;
            if (tmp >= 0 && tmp <= 9) count.push_back(i);
        }
        int other_size = s.size() - point.size() - e.size() - minus_sign.size() - jiahao.size() - count.size();
        if (other_size>0) return false;
        if (point.size() != 0){
            if (point.size() > 1||s.size()==1) return false;
            if (e.size() == 1){
                if (point[0] > e[0]) return false;
            }
            else{
                if (point[0] - 1 >= 0){
                    if (s[point[0] - 1] == '+' || s[point[0] - 1] == '-') {
                        if (point[0] + 1 >= s.size()) return false;
                    }
                }
                if (point[0] + 1 <= s.size() - 1){
                    if (s[point[0] + 1] == '+' || s[point[0] + 1] == '-') {
                        if (point[0] - 1 < 0) return false;
                    }
                }
            }
        }
        if (e.size() != 0){
            if (e.size() > 1) return false;
            if (s[0] == 'e' || s[s.size() - 1] == 'e') return false;
            else {
                string left = s.substr(0, e[0]);
                string right = s.substr(e[0] + 1, s.size() - 1 - e[0]);
                bool x=isNumber(left);
                bool y = isNumber(right);
                if (x == true && y == true) return true;
                else return false;
            }
        }
        else{
            if (minus_sign.size() + jiahao.size() > 1) return false;
            else{
                if (minus_sign.size() == 1){
                    if (minus_sign[0] != 0 || s.size() == 1) return false;
                    else return true;
                }
                else if (jiahao.size() == 1){
                    if (jiahao[0] != 0 || s.size() == 1)return false;
                    else return true;
                }
                else return true;
            }
        }
    }
    };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值