LeetCode 65 — Valid Number(java)

本文详细探讨了如何判断一个字符串是否能表示一个有效的数字。包括整数、浮点数及科学计数法形式的数字。文章通过分析各种边界条件,提供了一个逐步完善的Java实现方案。

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

题目链接

Validate if a given string is numeric.


Examples:

“0” => true
” 0.1 ” => true
“abc” => false
“1 a” => false
“2e10” => true


翻译

验证给定的字符串是否为数字。


分析

   最开始看到这个的时候就觉得很简单,为什么会是个hard,在每次提交的时候,才知道一堆坑,并且刷新了我的认识。

最初想法:
1. 先用trim()去掉头尾可能存在的空格
2. 遍历,若存在空格,直接false
3. 若存在除e外的其他字符,一样false
4. 若小数点后没有数字,依旧false (这个情况其实应该是true)
5. 小数点和e只能有一个,小数点必须在e之前

   但是这样的想法缺少了一些情况,缺少的情况都在代码注释中提到了,这些情况都是在一次次submit solution中报的错误中得出来的。╮(๑•́ ₃•̀๑)╭

最终想法(作为上面缺失情况的补充)

  • 上面第三点只考虑了 “e”,还需要加入对正负号判断的情况
  • e的前面后面需要判断是否有数字
  • 小数点前面和后面可以没有数字
  • 考虑 “+” , “-” , “e” , “.” 不能混着

java代码

class Solution {
    public boolean isNumber(String s) {
        //num记录数字个数,words记录字母个数,dot记录点的个数
        int num = 0, words = 0, dot = 0, i = 0;
        s = s.trim();
        int len = s.length();

        //先排除 "", "xxe", "xxe+", "xxe-"  情况
        if (s.length() == 0 || s.charAt(s.length() - 1) == 'e' || s.charAt(s.length() - 1) == '+' || s.charAt(s.length() - 1) == '-')
            return false;

        //如果是"-xxx""+xxx",第一个带有正或负的符号,下标后移跳过第一个符号。
        if (s.charAt(0) == '-' || s.charAt(0) == '+') {
            len--;
            i++;
        }

        for (; i < s.length(); i++) {
            //排除 "+e", "-e"
            if ((len == 1 && s.charAt(i) == 'e') || (len == 1 && s.charAt(i) == '.')) {
                return false;
            } else if ((s.charAt(i) == 'e' && words != 1) && num != 0) {    
              //遍历到"e"时,前面没有其他字母并且有数字,就算是合格的,做下记录
                words++;            
            } else if ((s.charAt(i) == '.' && dot != 1) && words != 1) {
              //遍历到"."时,前面没有"."并且没有"e",就算是合格的,做下记录
                dot++;            
            } else if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
              //记录数字
                num++;
            } else if (s.charAt(i) == '+' || s.charAt(i) == '-') {
                // 排除 "xxe+""xxe-" 情况
                if (s.charAt(i - 1) != 'e') {
                    return false;
                }
            } else {
                return false;
            }
        }
        //排除 "xxe."
        if (s.charAt(s.length() - 1) == '.' && words != 0)
            return false;

        return true;
    }
}

通过情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值