[leetcode题解] 剑指offer20:表示数值的字符串

https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/submissions/

文章目录

分析

这道题主要考察思维全面性和编程能力,如果不能归纳出所有的案例,编码时就要处理各种细节,难以写出高质量的代码。
举几个例子:
3.2e+93.e9.e8+.3e-2这些都是有效的数值。乍一看很难理解,但只要我们明白数值由整数部分、小数部分、指数部分组成就容易理解了。
去除字符串首尾的空格后,表示数值的字符串模式为:A[.[B]][e|EA]A是整数部分,代表有符号的整数(即前面可以有+-号);B代表无符号的整数;[.[B]]代表小数部分;[e|EA]代表指数部分。
注意,小数点前后的整数部分不必同时存在,但至少要有一个指数部分的前后必须都要有数字
列出这个模式后,就可以实现非常简单有效的编码,而不必使用有限状态自动机。

解法

采用一个index来遍历字符串,按照字符串的模式,首先判断是否能扫描出A,接着根据有没有小数点.来判断是否需要扫描出B,最后根据有没有eE来判断是否需要扫描出指数部分的A。如果这3个部分都扫描完了,index还没有到字符串的尾部,那这就不是合法的数值。

代码
class Solution {
    private int index = 0;

    public boolean isNumber(String s) {
        s = s.trim(); // 去除首尾空格
        boolean numeric = scanInteger(s);
        if (index < s.length() && s.charAt(index) == '.') { // 出现'.',扫描小数部分
            index++;
            // 小数部分前后只要有一个整数部分就可以
            numeric = scanUnsignedInteger(s) || numeric; 
        }
        if (index < s.length() && (s.charAt(index) == 'e' || s.charAt(index) == 'E')) {
            index++;
            // 指数部分前后都必须有整数部分
            numeric = scanInteger(s) && numeric;
        }
        return numeric && index == s.length();
    }

    private boolean scanUnsignedInteger(String s) {
        if (index == s.length() || !Character.isDigit(s.charAt(index))) return false;
        while (index < s.length() && Character.isDigit(s.charAt(index))) index++;
        return true;
    }

    private boolean scanInteger(String s) {
        if (index == s.length()) return false;
        if (s.charAt(index) == '+' || s.charAt(index) == '-') index++;
        return scanUnsignedInteger(s);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值