【LeetCode-剑指Offer】20. 表示数值的字符串

这篇博客介绍了如何判断一个字符串是否表示数值,包括正则表达式和有限状态自动机两种解决方案。正则表达式方法简单但可能存在误判,而有限状态自动机方法更精确,通过定义不同状态并设计状态转移规则来处理字符串中的各个部分,如正负号、小数点、幂符号等。
摘要由CSDN通过智能技术生成

一、题目

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。

二、解决

1、正则表达式

补充:待完善,case “e9” 结果错误。

public class Solution {
   
    public boolean isNumeric(char[] str) {
   
        String string = String.valueOf(str);
        return string.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
    }
}
/*
以下对正则进行解释:
[\\+\\-]?            -> 正或负符号出现与否
\\d*                 -> 整数部分是否出现,如-.34 或 +3.34均符合
(\\.\\d+)?           -> 如果出现小数点,那么小数点后面必须有数字;
                        否则一起不出现
([eE][\\+\\-]?\\d+)? -> 如果存在指数部分,那么e或E肯定出现,+或-可以不出现,
                        紧接着必须跟着整数;或者整个部分都不出现
*/

2、常规思路

思路:

分类标准:A.BeC或A.BEC。
组成

处理逻辑:对输入字符串从左到右,按顺序判断是否包含这三部分。

  • 在字符串后添加结束标志;
  • scanInteger():扫描有符号整数,用来匹配A和C部分;
  • scanUnsignedInteger():扫描无符号整数,用来匹配B部分。

注意:输入用例中,字符串首尾空格合法,如“空格1.2空格”是返回true的。所以跳过首尾空格。

代码:

class Solution {
   
    private int pos = 0;
    public boolean isNumber(String s) {
   
    	// 空字符串
        if (s == null || s.length() == 0) return false;
        // 添加结束标志
        s = s + '|';
        // 1、首部空格
        while (s.charAt(pos) == ' ') pos++;
        // 2、整数部分
        boolean num = scanInt(s);
        // 3、小数部分:小数点及无符号整数
        if (s.charAt(pos) == '.') {
   
            pos++;
            // 注意scanUnsignedInteger要在前面,否则不会扫描小数点后面的整数。因为||有断路功能,前面为true,后面不计算,这个会影响pos指针的移动。进而影响最后返回时最后一个字符不一定为 |
            // 如“0.8” return false,正确是true。
            // 处理小数部分,用 || 原因:
            // 1. 小数没整数部分,如.123等于0.123
            // 2. 小数点后面可以没有数字,如233.等于233.0
            // 3. 小数点前后都有数字
            num = scanUnsignedInt(s) || num;
        }
        // 4、指数部分
        if (s.charAt(pos) == 'E' || s.charAt(pos) == 'e') {
   
            pos++;
            
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值