首页 > 编程语言 >剑指offerJZ20题 表示数值的字符串 java

剑指offerJZ20题 表示数值的字符串 java

时间:2024-03-28 22:33:06浏览次数:23  
标签:pre offerJZ20 java 整数 计数法 lat str 字符串 小数

描述

剑指offerJZ20题 表示数值的字符串

请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。

科学计数法的数字(按顺序)可以分成以下几个部分:

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

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

1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 可能是以下描述格式之一:
3.1 至少一位数字,后面跟着一个点 ‘.’
3.2 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
3.3 一个点 ‘.’ ,后面跟着至少一位数字
4.若干空格

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

1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 至少一位数字
4.若干空格

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

提示:
1.1 <= str.length <= 25
2.str 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ 。
3.如果怀疑用例是不是能表示为数值的,可以使用python的print(float(str))去查看
进阶:时间复杂度O(n) ,空间复杂度O(n)

方法一:正则表达式

思路:根据正则表达式匹配字符来实现。由科学计数法中,'E’或’e’的前面为一个整数或者小数,那我们先用正则表达式实现判断整数或者小数:"\\s*[+-]?((\\d+)|((\\d*\\.\\d+)|(\\d+\\.\\d*)))(\\S)*" 然后再补充上科学计数法的后缀:([Ee][+-]?\\d+)?(\\s)*,最终表达式为: "\\s*[+-]?((\\d+)|((\\d*\\.\\d+)|(\\d+\\.\\d*)))([Ee][+-]?\\d+)?(\\s)*"
代码实现:

 import java.util.*;
 import java.util.regex.Pattern;


 public class Solution {
    /**
      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
      *
     * 
     * @param str string字符串 
      * @return bool布尔型
      * \\s代表空,\\d代表数字, ?代表一次或零次, *代表零次或多次, +代表一次或多次, | 代表或,但要注意,他的使用规则是(a|b)必须带一个小括号, 不是只匹配挨着的两个。
     *  思路:先判断整数或小数,因为科学计数法的前面也是整数或者小数,最后加上科学计数法的后位,用?表示有或者没有
     *
      */
     public boolean isNumeric (String str) {
       String patterns = "\\s*[+-]?((\\d+)|((\\d*\\.\\d+)|(\\d+\\.\\d*)))([Ee][+-]?\\d+)?(\\s)*";
       return Pattern.matches(patterns, str);
    }
}

方法二:遍历

思路:遍历字符串,思路同样是先判断整数或小数,然后再判断科学计数法的后缀,具体逻辑和代码实现如下

import java.util.*;
public class Solution {
   
   private int pre = 0;
   
   //先过滤掉符号,再进入无符号数字的判断
   private boolean integer(String s){
       if (pre < s.length() && (s.charAt(pre) == '+' || s.charAt(pre) == '-')) pre++;
       return unsigned(s);
   }
   //判断这个字符的第一个非数字符号前面是否存在数字
   private boolean unsigned(String s){
     int temp = pre;
     while (pre < s.length() && (s.charAt(pre) <= '9' && s.charAt(pre) >= '0')) pre++;
     return pre > temp;
   }
   public boolean isNumeric (String str) {
       //判断字符串为空或者为零的情况
       if (str == null || str.length() == 0) return false;
       //得到第一个字符的下标
       while (pre < str.length() && str.charAt(pre) == ' ') pre++;
       int lat = str.length() - 1;
       //得到最后一个字符的下标的后一位
       while (lat >= 0 && str.charAt(lat) == ' ') lat--;
       lat++;
       //此处判断字符串是否全为空格
       if (lat <= pre) return false;
       //此处判断在遇到第一个非数字字符前,是否有数字(不区分有无符号)
       boolean flag = integer(str);
       //当第一个非字符为'.'时,根据小数的逻辑,'.'的前后至少有一处
       //含有数字,并且前面的数字可以带符号,后面的数字不能带符号
       //pre<lat是防止后面访问越界,如果字串全为数字则经过integer(str)后,pre = str.length(), 后续访问就会越界。
       if (pre < lat && str.charAt(pre) == '.') {
           pre++;
       //此处unsigned(str)和flag位置不能颠倒,比如字符串为"600.0"时,
       //flag为真则不会执行unsigned(str),导致pre少加一位,最后会导致
       //pre == lat 判断错误
           flag = unsigned(str) || flag;
       }
       //当遇到'e'或'E'时,符号前方可以为小数或者整数(上文已判断),符
       //号后方为整数(可以带正负号)
       if (pre < lat && (str.charAt(pre) == 'E' || str.charAt(pre) == 'e')) { 
           pre++;
           flag = flag && integer(str);
       }
       //pre == lat 用于判断遍历是否完全,排除有其他字符的情况
       return flag && (pre == lat);
       
   }
}

标签:pre,offerJZ20,java,整数,计数法,lat,str,字符串,小数
From: https://blog.csdn.net/dastatham/article/details/137126113

相关文章

  • 选择排序(java)
    选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列解题思路:选择排序的基本思路是遍历整个数组,每次找到剩余部分中的最小值,然后将其与当前位置进行交换。这样每一次遍历都能确定一个元素的最终位置,......
  • Java 多态、包、final、权限修饰符、静态代码块
    多态Java多态是指一个对象可以具有多种形态。它是面向对象编程的一个重要特性,允许子类对象可以被当作父类对象使用。多态的实现主要依赖于继承、接口和方法重写。在Java中,多态的实现主要通过以下两种方式:继承:子类继承父类的属性和方法,可以对方法进行重写(覆盖),从而实现不同的......
  • Java项目:77 springboot母婴商城
    作者主页:源码空间codegym简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍本课题后端使用SpringBoot+SpringCloud框架,前端采用html,JQuery,JS,DIV+CSS技术进行编程,设计在线商城。系统具有前台和后台两大服务。前台主要有用户登录注册、浏......
  • Java项目:73 ssm档案管理系统
    作者主页:源码空间codegym简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍角色:管理员、用户用户点击进入到系统操作界面,可以对个人中心、警察信息管理、事故信息管理、申诉信息管理等功能模块管理员登录成功后进入到系统操作界面,可以对个......
  • Java项目:75 springboot房产销售系统
    作者主页:舒克日记简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍使用房产销售系统分为管理员和用户、销售经理三个角色的权限子模块。管理员所能使用的功能主要有:首页、个人中心、用户管理、销售经理管理、房源信息管理、房源类型管理、......
  • Java项目:78 springboot学生宿舍管理系统的设计与开发
    作者主页:舒克日记简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍系统的角色:管理员、宿管、学生管理员管理宿管员,管理学生,修改密码,维护个人信息。宿管员管理公寓资产,缴费信息,公共场所清理信息,日常事务信息,审核学生床位安排信息。学生查......
  • 多层JSON字符串对象的差异化比较
    importcn.hutool.core.util.ObjUtil;importcn.hutool.core.util.StrUtil;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.node.ObjectNode;importlombok.Data;importl......
  • Java抽象类详解:定义、特性与实例化限制(day12)
    抽象类总结一下今天老师上课的内容,前面几节课听得是有点懵,在讲到内存问题,也就是代码在栈、堆、以及方法区是怎么执行的,听得不是很懂,今天讲到抽象类以及重写的机制,似乎开始慢慢懂得了java的底层原理。父类:子类:上面的Cat类重写父类的eat()方法。Test:如果我们将父类的......
  • JAVA学习笔记
    第一章Java起步入门 #jdk版本JavaSE(J2SE,Java2PlatformStandardEdition,标准版)JavaSE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持JavaWeb服务开发的类,并为JavaEE和JavaME提供基础。JavaE......
  • 基于Java的学生体质健康管理系统的设计与实现
    摘 要随着时代的进步,信息化也在逐渐深入融进我们生活的方方面面。其中也给健康管理带来了新的发展方向。通过对学生体质健康管理的研究与分析发现当下的管理系统还不够全面,系统的性能达不到使用者的要求。因此,本文结合Java的优势和流行性,使用Java语言和SpringBoot框架进行构......