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

测试结果

相关推荐
惊骇世俗王某人7 分钟前
1. 深入理解ArrayList源码
java·开发语言
kanhaoning8 分钟前
将重排序大模型Qwen3-Reranker-8B的知识蒸馏到小模型BGE-reranker-v2-m3上
算法
CoovallyAIHub12 分钟前
2025年小目标检测分享:从无人机视角到微观缺陷的创新模型
深度学习·算法·计算机视觉
用户403159863966316 分钟前
表达式并发计算
java·算法
前端拿破轮27 分钟前
不是吧不是吧,2025年了还有人不会括号匹配?
算法·leetcode·面试
SimonKing28 分钟前
告别System.currentTimeMillis()!Java高精度计时最佳实践
java·后端·程序员
Dcs28 分钟前
JUnit 5架构如何用模块化颠覆测试框架?
java
肉肉不想干后端32 分钟前
gRPC服务架构整合springboot部署实践指南
java
CoovallyAIHub1 小时前
无人机图像中的小目标检测新利器:深入解析 LAM-YOLO 模型
深度学习·算法·计算机视觉
天天摸鱼的java工程师1 小时前
volatile关键字实战指南:八年Java开发者详解五大应用场景
java·后端