当前位置: 首页 > news >正文

表示数值的字符串 -- java

题目描述

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

例如,字符串 “+100”,“5e2”,"-123",“3.1416” 和 “-1E-16” 都表示数值。但是 “12e”,“1a3.14”,“1.2.3”,“±5” 和 “12e+4.3” 都不是。

解题思路

非正则表达式解法

表示数值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC]
其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着’e’或者‘E’为数值的指数部分。在小数里可能没有数值的整数部分。例如,小数.123等于0.123。因此A部分不是必需的,如果一个数没有整数部分,那么它的小数部分不能为空。

上诉A和C都是可能以‘+’或者‘-’开头的0-9的数字串;B也是0-9的数位串,但前面不能有正负号。

判断一个字符串是否符合上述模式时,首先尽可能多地扫描0-9的数位(有可能在起始处有‘+’或者‘-’),也就是前面模式中表示数值的A部分,如果遇到小数点’.’,则开始扫描数值小数部分的B部分。如果遇到’e’或者‘E’,则开始扫描数值指数的C部分。

正则表达式解法

使用正则表达式进行匹配:

[]  : 字符集合
()  : 分组,在这里是为了让表达式更清晰
?   : 重复 0 ~ 1+   : 重复 1 ~ n 次
*   : 重复 0 ~ n 次
.   : 任意字符
\\. : 转义后的.
\\d : 任意数字

代码

非正则表达式解法

public class IsNumberic {
    // 定义str的索引位置
    private static int i = 0;

    public static boolean isNumberic(char[] str) {
        // 防止非法输入
        if (str == null) {
            return false;
        }

        // 1. 扫描A
        boolean numberic = scanInteger(str);

        // 2. 扫描B
        if (i < str.length && str[i] == '.') {
            i++;
            // 下面一行代码用||的原因
            // 1. 小数可以没有整数部分,如.123等于0.123
            // 2. 小数点后面可以没有数字,如233.等于233.0
            // 3. 当然,小数点前面和后面可以都有数字,如233.666
            numberic = numberic || scanUnsignedInteger(str);
        }

        // 3. 扫描C
        if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
            i++;
            // 下面一行代码用&&的原因:
            // 1.当e或者E前面没有数字时,整个字符串不能表示数字,如.e1、e1;
            // 2.当e或者E后面没有整数时,整个字符串不能表示数字,如12e、12e+5.4;
            numberic = numberic && scanInteger(str);
        }
        return numberic && i == str.length;
    }

    // 扫描是否有 无符号整数部分(在起始处不可能有‘+’或者‘-’)
    public static boolean scanUnsignedInteger(char[] str) {
        int before = i;
        while (i < str.length && str[i] >= '0' && str[i] <= '9') {
            i++;
        }
        return i > before;
    }

    // 扫描是否有 整数部分(有可能在起始处有‘+’或者‘-’)
    public static boolean scanInteger(char[] str) {
        if (i < str.length && (str[i] == '+' || str[i] == '-')) {
            i++;
        }
        return scanUnsignedInteger(str);
    }

    // 测试
    public static void main(String[] args) {
        String str = "+100";
        System.out.println(isNumberic(str.toCharArray())); // true

        // 将索引i恢复为0
        i = 0;

        str = "5e2";
        System.out.println(isNumberic(str.toCharArray())); // true

        // 将索引i恢复为0
        i = 0;

        str = "12e";
        System.out.println(isNumberic(str.toCharArray())); // false

    }

}

正则表达式解法

// 正则表达式解法
public class isNumberic_2 {
    public static boolean isNumberic_2(String str) {
        // 防止特殊输入
        if (str == null || str.length() < 0) {
            return false;
        }

        return new String(str).matches("[+-]?[\\d]*[\\.]?[\\d]*([eE][+-]?\\d+)?");
    }

    public static void main(String[] args) {
    
        System.out.println(isNumberic_2("233."));
    }
}


来自:
《剑指Offer》
Coding-Interviews/表示数值的字符串.md at master · todorex/Coding-Interviews

相关文章:

  • 调整数组顺序使奇数位于偶数前面 -- java
  • 链表中倒数第K个节点 -- java
  • Mac查看npm安装位置
  • idea env: node: No such file or directory
  • 链表中环的入口节点 -- java
  • 反转链表 -- java
  • 合并两个排序的链表 -- java
  • Mac上使用宁芝普拉姆键盘的记录
  • idea Mac格式化代码快捷键
  • 搜狗输入法关闭候选词中的图标只显示文字
  • Mac关闭idea的双击shift全局搜索功能
  • 树的子结构 -- java
  • 二叉树的镜像 -- java
  • java 遍历二叉树使用循环方式
  • 隐藏csdn博客的标题X条消息的方式
  • [译]Python中的类属性与实例属性的区别
  • 0基础学习移动端适配
  • 2017-08-04 前端日报
  • AngularJS指令开发(1)——参数详解
  • in typeof instanceof ===这些运算符有什么作用
  • IndexedDB
  • js操作时间(持续更新)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Service Worker
  • Vim Clutch | 面向脚踏板编程……
  • 电商搜索引擎的架构设计和性能优化
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 扑朔迷离的属性和特性【彻底弄清】
  • 事件委托的小应用
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 数据库巡检项
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​MySQL主从复制一致性检测
  • ​插件化DPI在商用WIFI中的价值
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #Lua:Lua调用C++生成的DLL库
  • (007)XHTML文档之标题——h1~h6
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)换源+apt-get基础配置+搜狗拼音
  • (算法)Travel Information Center
  • (转)Linux下编译安装log4cxx
  • .Net 4.0并行库实用性演练
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net 代码性能 - (1)
  • /var/spool/postfix/maildrop 下有大量文件
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @Query中countQuery的介绍