Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目

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

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 'e''E' ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+''-'
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 '.'
    2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3. 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+''-'
  2. 至少一位数字

部分数值列举如下:

  • ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

  • ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

示例 1:

输入: s = "0"
**输出:**true

示例 2:

输入: s = "e"
**输出:**false

示例 3:

输入: s = "."
**输出:**false

示例 4:

输入: s = " .1 "
**输出:**true

提示:

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.'

解题思路

1.题目要求我们判断字符串是否表示**数值,**对于这种题我们需要进行分类讨论来对每一种情况进行判断。

2.首先我们判断一下字符串 s 是否为空,若为空就返回 false。然后因为空格是合法的,但是它会影响我们的判断,所以我们需要去除空格,用trim()函数,再将去除后的元素放入字符数组res中,方便我们进行判断。

3.之后我们用for循环进行遍历,逐一列举可能的情况并进行判断,大家可以结合流程图和代码进行理解。

代码实现

java 复制代码
class Solution {
    public boolean isNumber(String s) {
        if(s == null || s.length() == 0){
            return false;
        }
        char[] res = s.trim().toCharArray();
        if(res.length <= 0){
            return false;
        } 
        int n = res.length;
        boolean is_dot = false;
        boolean is_num = false;
        boolean is_E_or_e = false;
        for(int i = 0; i < n; i++){
            //当前元素为数字时
            if(res[i] >= '0' && res[i] <= '9' ){
                is_num = true;
                //当前元素为.时
            }else if(res[i] == '.'){
                //前面不能有.和e/E
                if(is_dot || is_E_or_e){
                    return false;
            }
            is_dot = true;
            //当前元素为e/E时
        }else if(res[i] =='e' || res[i] == 'E'){
            //前面必须有一个数字,前面不能出现e/E
            if(!is_num || is_E_or_e){
                return false;
            }
            is_E_or_e = true;
            is_num = false; //防止发送11E的这种情况,所以要将is_num重置
            //当前元素为'-''+'时
        }else if(res[i] == '+' || res[i] == '-'){
            if(i != 0 && res[i-1] != 'e' && res[i-1] != 'E'){
                return false;
             }
             //不是以上的五种字符
        }else{
            return false;
        }
        }
        return is_num;
    }
}

测试结果

相关推荐
徐浪老师14 分钟前
深入解析贪心算法及其应用实例
算法·贪心算法
软行16 分钟前
LeetCode 单调栈 下一个更大元素 I
c语言·数据结构·算法·leetcode
钰爱&1 小时前
【操作系统】Linux之线程同步二(头歌作业)
linux·运维·算法
拒绝头秃从我做起1 小时前
14.最长公共前缀-力扣(LeetCode)
leetcode
Ws_1 小时前
leetcode LCR 068 搜索插入位置
数据结构·python·算法·leetcode
灼华十一1 小时前
数据结构-布隆过滤器和可逆布隆过滤器
数据结构·算法·golang
代码调试2 小时前
Springboot校园失物招领平台
java·spring boot
adam_life3 小时前
OpenJudge_ 简单英文题_04:0/1 Knapsack
算法·动态规划
camellias_3 小时前
SpringBoot(二十三)SpringBoot集成JWT
java·spring boot·后端
tebukaopu1483 小时前
springboot如何获取控制层get和Post入参
java·spring boot·后端