[剑指offer刷题] 31. 表示数值的字符串(普通题)

本文解析了如何通过简单的分类讨论实现一个Java函数,用于判断字符串是否符合数值(整数和小数)的格式要求,包括处理+/-、.、e/E等特殊字符的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题型: 普通题

没有使用特殊的算法,只是单纯的分类讨论

分类讨论

  1. 首先去点开头结尾的空格
  2. 若以 +, -开头则去掉得到新的字符串s
  3. 若s为空,或者s为单个点,则返回false
  4. 开始循环,循环变量为i,设置dot和e分别记录 . e/E出现的次数
    1. 若第i个字符为数字,则不做任何处理;
    2. 若第i个字符为.,则将dot加一,并判断dot是否大于1,e是否大于0,若是则返回false
    3. 若第i个字符为e/E,则e++,判断e前面和后面是否均为整数。若i等于0,或者i等于长度减1,或者i-1处为点则返回false
    4. 其他情况均,返回false
  5. 若循环结束后没有返回false,则返回true。

题目

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

例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。

但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

注意:

小数可以没有整数部分,例如.123等于0.123;
小数点后面可以没有数字,例如233.等于233.0;
小数点前面和后面可以有数字,例如233.666;
当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

样例:

输入: “0”

输出: true

java解法

class Solution {
    public boolean isNumber(String s) {
        int star = 0, end = s.length() - 1;
        while (star <= end && s.charAt(star) == ' ') star++;
        while (star <= end && s.charAt(end) == ' ') end--;
        
        if (star > end) return false;
        
        s = s.substring(star, end - star + 1);
        
        // System.out.println(s);
        
        if (s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1);
        
        // 去掉单个的 '+', '-', '.'
        if (s.length() == 0 || (s.charAt(0) == '.' && s.length() == 1)) return false;
        
        int dot = 0, e = 0;  // 记录 '.' 和 'e/E' 的出现次数
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9');  // 如果是数字,则什么也不做
            else if (s.charAt(i) == '.') {
                // 当前字符是 '.'
                dot++;
                if (dot > 1 || e > 0)  // 如果出现了多个点,或者点之前出现了e
                    return false;
            }
            else if (s.charAt(i) == 'e' || s.charAt(i) == 'E')  {
                // 当前字符为e、E
                // e前面必须有整数, e后面必须有整数
                e++;
                if (i == 0 || i == s.length() - 1 || e > 1 || s.charAt(i-1) == '.') return false;
                if (s.charAt(i + 1) == '+' || s.charAt(i+1) == '-') {
                    if (i + 2 == s.length()) return false;
                    i++;
                }
            }
            else return false;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东阳z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值