剑指offer 19. 表示数值的字符串

简介: 剑指offer 19. 表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。


例如,字符串"+100","5e2","-123","123.e+10","3.1416"和"-1E-16"都表示数值。


但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。


注意:小数可以没有整数部分,例如.123等于0.123;

小数点后面可以没有数字,例如233.等于233.0;

小数点前面和后面可以有数字,例如233.666;

当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;

当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

数据范围

输入字符串长度 [0,25]。

字符串中不含空格。

样例:

输入: "0"
输出: true


方法一:模拟,字符串处理 O(n)


具体思路如下:


先去除行首和行尾空格。


行首如果有一个正负号,直接忽略。


如果字符串为空或只有一个 '.' ,则不是一个合法数。


循环整个字符串,去掉以下几种情况:


(1) '.' 或 'e' 多于 1 个。


(2) '.' 在 'e' 后面出现。


(3) 'e' 后面或前面为空,或者 'e' 前面紧跟着 '.' 。


(4) 'e' 后面紧跟着正负号,但正负号后面为空。


剩下的情况都合法

class Solution {
public:
    bool isNumber(string s) {
        //先删除行头和行尾的空格
        int i = 0;
        while (i < s.size() && s[i] == ' ')    i++;
        int j = s.size() - 1;
        while (j >= 0 && s[j] == ' ')  j--;
        if (i > j) return false;   //字符串不能为空
        s = s.substr(i, j - i + 1);
        if (s[0] == '-' || s[0] == '+')    s = s.substr(1);  //去掉开头正负号
        if (s.empty() || s[0] == '.' && s.size() == 1)   return false; //不能为空且不能只有'.'
        int dot = 0, e = 0; //分别记录点的数量和e的数量
        for (i = 0; i < s.size(); i++)
        {
            if (s[i] >= '0' && s[i] <= '9');
            else if (s[i] == '.')
            {
                dot++;
                //'.'数量不能大于1且其前面不能有e或E
                if (dot > 1 || e)   return false;
            }
            else if (s[i] == 'e' || s[i] == 'E')
            {
                e++;
                //e或E前面后面不能没有数字,且其数量不能大于1,且'.e'或'.E'前要有数字
                if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.') return false;
                if (s[i + 1] == '-' || s[i + 1] == '+')
                {
                    //e或E后面不能没有数字
                    if (i + 2 == s.size())   return false;
                    i++;
                }
            }
            else return false;
        }
        return true;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
6月前
leetcode-415:字符串相加
leetcode-415:字符串相加
44 0
|
6月前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
6月前
|
Java 测试技术 Python
每日一题《剑指offer》字符串篇之表示数值的字符串
每日一题《剑指offer》字符串篇之表示数值的字符串
47 0
每日一题《剑指offer》字符串篇之表示数值的字符串
|
11月前
|
存储 算法
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
【剑指offer】- 把字符串转换成整数 -46/67
【剑指offer】- 把字符串转换成整数 -46/67
|
存储 算法 Java
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
60 0
剑指offer 75. 把字符串转换成整数
剑指offer 75. 把字符串转换成整数
57 0
004. leetcode415. 字符串相加(002)
1. 字符串中insert函数的使用(具体看这篇博客☞《从零开始实现 std::string:让你更深入地了解字符串的本质》) 2.进阶相关题(《leetcode43. 字符串相乘》)
50 0
|
存储 算法 Java
算法打卡Day27_leetcode _415字符串相加
算法打卡Day27_leetcode _415字符串相加
算法打卡Day27_leetcode _415字符串相加