剑指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;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
8月前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
8月前
|
Java 测试技术 Python
每日一题《剑指offer》字符串篇之表示数值的字符串
每日一题《剑指offer》字符串篇之表示数值的字符串
58 0
每日一题《剑指offer》字符串篇之表示数值的字符串
|
8月前
|
Java
每日一题《剑指offer》字符串篇之字符串的排列
每日一题《剑指offer》字符串篇之字符串的排列
82 0
每日一题《剑指offer》字符串篇之字符串的排列
|
存储 算法
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
|
存储 算法 Java
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
61 0
|
存储 机器学习/深度学习
母牛的故事 替换空格 二进制中1的个数 不使用第三个变量交换a,b的值
母牛的故事 替换空格 二进制中1的个数 不使用第三个变量交换a,b的值
97 0
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
64 0
剑指offer 15. 数值的整数次方
剑指offer 15. 数值的整数次方
58 0
|
存储 算法 C++
Day6——有效的字母异位词、两个数组的交集、快乐数、两数之和(哈希)
Day6——有效的字母异位词、两个数组的交集、快乐数、两数之和(哈希)
108 0
|
算法
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
91 0