JAVA练习40-表示数值的字符串

该博客讨论了如何用JAVA实现一个函数,用于判断给定的字符串是否表示数值,包括整数和小数。文章通过分析和使用分治算法,解释了如何处理各种情况,如符号、小数点和指数,并提供了示例。博客还提到了时间复杂度和空间复杂度,并链接到LeetCode的相关题目。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

  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),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

分析: 

方法:分治算法

这道题主要考验的是对情况的分类,但是一个个 if 语句进行判断未免太过麻烦,其实每次遍历都可以根据上一次遍历的结果来得到答案,比如说:

  1. 当前字符为加、减,前面不能是数字、加、减、点
  2. 当前字符为点,前面不能是点、e、E
  3. 当前字符为 e 或 E,前面不能是空、e、E
  4. e、E、点只能出现一次

因此我们只需要记录上一次遍历数字、加减、点、e(E) 的状态,就能知道这一层字符的状态。

时间复杂度:O(n)
空间复杂度:O(1) 

class Solution {
    public boolean isNumber(String s) {
        //消除字符串的空格
        char[] cs = s.trim().toCharArray();
        //记录长度
        int len = cs.length;
        //标识遍历位置前面是否为数字,E,+-,.
        boolean isNum = false, isE = false, isAddSub = false, isDot = false;
        //定义索引
        int i = 0;
        while(true){
            //判断是否为数字,将数字索引跳到没数字的位置
            while(i < len && cs[i] >= '0' && cs[i] <= '9'){
                i++;
                isNum = true;
            }
            //遍历完成
            if(i == len){
                break;
            }
            // e/E 只能出现一次,且前面只能为整数
            if(cs[i] == 'e' || cs[i] == 'E'){
                if(isE || !isNum){
                    return false;
                }
                isE = true;
                isNum = false;
                isAddSub = false;
                isDot = false;
            }
            // +-前面不能为+-,数字,.
            else if(cs[i] == '+' || cs[i] == '-') {
                if (isAddSub || isNum || isDot) {
                    return false;
                }
                isAddSub = true;
            }
            // . 前面不能为 . 和 e/E
            else if(cs[i] == '.'){
                if(isDot || isE){
                    return false;
                }
                isDot = true;
            }
            // 其他情况直接返回 false
            else{
                return false;
            }
            i++;
        }
        return isNum;
    }
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值