这道LeetCode题究竟有什么坑点,让它的反对是点赞的9倍?

Leetcode:200题总结(一) 题目做后还是要做一下总结,才能确切的知道自己通过做题收获了什么。 之前我一直享受刷题的快感,懒于及时做整理、总结,拖到了现在,刷了200题才打算开始。 这200题中有水题,有自己冥思苦想才解出的题,也有苦想之后做不出来然后看答案的题,也有一看题就知道自己不会做然后直接看答案的题。 979. Distribute Coins in Binary Tree class Solution { publi... 阅读详情

本文始发于个人公众号:TechFlow,原创不易,求个关注


今天是LeetCode专题的第38篇文章,我们一起来看看第65题,Valid Number。

曾经我们聊到过算法当中的一个类别——模拟题。所谓的模拟题就是题面非常简单,也不涉及任何复杂的算法,但是要实现的功能比较麻烦,非常考验人思维的缜密程度,很难写出bug-free的代码来。今天要说的65题可以说是其中的典范,它的题面非常简单,简单到只有一句话,但是要实现非常麻烦,比较锻炼人的耐心,我们一起来看看。


题面


给定一个字符串,判断它是否是一个合法的浮点数。

从题面来看只有一句话,似乎非常简单。但是实际上如果你仔细研究一下样例和提示,会发现事情可能和你想的不太一样。


样例
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3   " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false

提示
我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:

数字 0-9
指数 - "e"
正/负号 - "+"/"-"
小数点 - "."
当然,在输入中,这些字符的上下文也很重要。

不知道大家感受到了没有,这其中的情况不少,涉及的符号就很多。除了基本的数字之外,还有小数点、空格、正负号、e。这些符号带来的合法和非法的情况都很多,更何况这些符号之间还可以互相组合,又会引申出新的情况。

更坑爹的一点是,这题简单粗暴,只有这一个解法,我们别无选择,只有覆盖所有的情况才能通过。所以如果你试着去想清楚所有的这些情况,你会发现这是非常困难的一件事,甚至可能会越想情况越多,觉得怎么也理不清楚,即使你理出了很多情况,也不知道是否有遗漏,很容易让人抓狂并且心烦气躁,明明很简单的问题做不出来,感受肯定不好。先别着急,这正是模拟题考验人的地方,它考验的不仅是思维,也是心态。

所以,先深吸一口气,冷静下来,我们仔细地分析一下这些情况。


解法


我们从列举所有的情况入手是非常困难的,因为符号之间互相组合的情况实在是很多,一一列举全并且用代码实现的代价很大。我们先把这些烦人的情况放在一边,我们先来思考一下问题所在。

这个问题的核心就是判断浮点数是否合法,合法的浮点数的情况也是不少的,但这些情况虽然多,彼此之间是有联系的。最起码我们可以发现符号之间的顺序,如果我们把一个合法的浮点数进行拆分,它大概可以分成以下几个部分。

首先是符号位,表示这个数是正数还是负数。题目当中没有明说,但是我们可以猜测出来,正数用正号表示也是合法的。

第二个部分是科学记数法的前半部分,它可以是一个小数。

第三个部分是e,即科学记数法当中的e。

最后一个部分是整数部分,表示e的指数,根据科学记数法的定义,必然是一个整数。但是可以是负数。

当我们把这四个部分列举出来之后,再来进行判断就容易多了。因为这四个部分是有顺序的,我们只需要判断它们顺序的合理性就可以了。根据顺序的合理性,我们可以进一步推测出每一个符号允许出现的位置,所有和预期位置不符的符号都是非法的。

根据这一点我们可以推导出一些结论:

  1. 空格只能出现在首尾,出现在中间一定是非法的。
  2. 正负号只能出现在两个地方,第一个地方是数字的最前面,表示符号。第二个位置是e后面,表示指数的正负。如果出现在其他的位置一定也是非法的。
  3. 数字,数字没有特别的判断,本题当中没有前导0的问题。
  4. e只能出现一次,并且e之后一定要有数字才是合法的,123e这种也是非法的。
  5. 小数点,由于e之后的指数一定是整数,所以小数点最多只能出现一次,并且一定要在e之前。所以如果之前出现过小数点或者是e,再次出现小数点就是非法的。

当我们把每一个符号合法的情况梳理清楚之后,会发现其实也没有那么复杂,情况也没有那么多。这其实也是常用套路,我们把互相耦合的一些变量拆分开了,彼此互不影响。这样我们就可以单独考虑这其中的每个零件,而不用面对它们互相耦合的复杂情况了。

我们把刚才梳理出来的全部用代码实现就可以通过这题了:

class Solution:
    def isNumber(self, s: str) -> bool:
        s = s.strip()
        numbers = [str(i) for i in range(10)]
        n = len(s)
        
        # 用4个标记记录e和小数点以及数字和e之后的数字有无出现过
        e_show_up, dot_show_up, num_show_up, num_after_e = False, False, False, False
        
        for i in range(n):
            c = s[i]
            # 如果是数字,则将数字和e后出现的数字都标记为true
            # 没有e的浮点数也认为e之后出现过数字
            if c in numbers:
                num_show_up = True
                num_after_e = True
            # 如果是正负号,只有出现在首位或者是e后面才是合法
            elif c in ('+', '-'):
                if i > 0 and s[i-1] != 'e':
                    return False
            # 如果是小数点,那么必须保证e和小数点都没有出现过
            elif c == '.':
                if dot_show_up or e_show_up:
                    return False
                dot_show_up = True
            # 如果是e,要保证已经有数字出现,并且e没有出现过
            elif c == 'e':
                if e_show_up or not num_show_up:
                    return False
                e_show_up = True
                num_show_up = False
            # 其他情况都视为非法
            else:
                return False
            
        return num_show_up and num_after_e

总结


这题我们看代码好像也不复杂,但是想要把这么多条件都梳理清楚,写出这样简单的代码也不是一件容易的事情。必须建立在我们对问题有了充分的思考的基础上,其实我们的代码还疏漏了一个条件就是前导零的情况。如果0出现在数字最前面其实也是非法的,不过这题当中没有针对这样的case,但实际上我们是应该考虑的,这里也是我偷懒了。

很多人很讨厌模拟题,包括我在内,原因就是情况太多很恶心人,经常会中招遗漏一些情况。看看这题的评分也能看得出来,点赞的只有678,反对的却又4572,可见一斑。但其实模拟题也是一种对思维的锻炼,需要我们有冷静的思维和理智的分析,这也是一个优秀的选手必不可少的。希望大家都能攻克这道难关。

今天的文章就到这里,原创不易,扫码关注我,获取更多精彩文章。

在这里插入图片描述

LeetCode刷题规划---设定4个月 算法 因为知道算法对以后面试大厂是必须会被提问,涉及到的问题。所以学好算法,对以后肯定是没什么坏处的。 个人经历 我自己其实已经有过一段时间的做题,但是一直没有什么成效,特别让人觉得沮丧的是昨天刚刚做的题,今天打开的时候,居然还要重新去找题解,重新看一遍。觉得这样进度缓慢,也找不到什么成就感,决定重新规划自己的做题路线和方法!所以我是打算定一个短期的目标期限为4个月,重新再来! 分享 首先做题方面每天要做多少题,这个问题的回答会有两个方面,1是“题海战术“,2是“归纳总结”。其实我之前就是支持“题 阅读详情

相关推荐

战胜LeetCode刷题 【数组篇】

数组目录:136. 只出现一次的数字 2022-01-11169. 多数元素 2022-01-1115. 三数之和 2022-01-124. 寻找两个正序数组的中位数 2022-01-1275. 颜色分类 2022-01-13119. 杨辉三角 II 2022-01-1448. 旋转图像 2022-01-1456. 合并区间 2022-01-1559. 螺旋矩阵 II 2022-01-17240. 搜索二维矩阵 II 2022-01-17435. 无重叠区间 2022-01-17704. 二分查找 2022

程序员战胜 723

刷LeetCode过程中的一点心得

在刷LeetCode的过程中的一点心得:我觉得应该按标签刷题,第一遍看答案。然后刷完第一遍后第二遍在随机不看答案刷题。在按标签刷题的过程中,总结刷题的套路。比盲目的随机刷,和按简单容易刷效果好。 这是我看到一个大神的博客后的一点感悟,这位大神,就刷了几十道题就能写出篇优秀的博客,实在佩服。该大神在刷了树和链表的专题后,总结了涉及到该题目都可以用递归的方法做出来套路。我看了后,不但学会了什么是递归,...

weixin_42269778的博客 1455

LeetCode高效刷题指南:从算法基础到实战心法

算法与数据结构是计算机科学的核心基础,它们通过特定的逻辑组织和操作规则,高效地解决各类计算问题。其原理在于通过抽象和建模,将复杂问题分解为可管理的子问题,从而优化时间和空间效率。掌握算法与数据结构的技术价值在于提升问题解决能力、优化程序性能,并为系统设计奠定坚实基础,尤其在面试和工程实践中至关重要。应用场景广泛,包括数据处理、搜索引擎、推荐系统、网络路由等。本文聚焦于LeetCode实战,通过系统化的知识体系构建和深度解题方法,帮助读者从盲目刷题转向高效学习,重点涵盖了动态规划、滑动窗口等高频考点,旨在培养

weixin_32430941的博客 264

LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第57篇文章,我们一起来看看LeetCode第91题,解码方法(Decode ways)。 这道题官方给定的难度是Medium,点赞2680,反对2845,通过率24.5%。从通过率上来看这道题似乎很难,甚至比很多Hard难度的问题还要难。从点赞和反对的数量来看,这道题应该算是褒贬不一,两边阵营的人数都很多。一般来说题目的评价都是一边倒为主,这种情况很少出现。首先值得一说的是,这道题我个人肯定认为是值得一做的,至于它是

TechFlow的博客 268

LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?

今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历。 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的题目当中算是很高的了。这题非常基础,可以说是程序员必会的算法题之一。 我们先来看题意。 题意 题意很短, 只有一句话,给定一棵二叉树,返回它中序遍历的结果。 样例 Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2] 用递归做这道题

TechFlow的博客 516

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

LeetCode 89,因为题目晦涩而被点了1500+反对的搜索问题

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第55篇文章,我们一起来看看LeetCode中的第89题 Gray Code(格雷码)。 这题的官方难度是Medium,通过率是48.9%,点赞639,反对1545。又是一道反对比点赞多得多的题目,我个人发现其实这些反对很多的题目都有一个特点,就是题意比较晦涩,出题人的意图不太容易get到。不知道是不是老外理解能力不太行,所以都给出了这么多的反对。 我们就来看看这道题的真面目吧。 题意 题目中说gray code,格

TechFlow的博客 267

30天入门 SAP BTP 开发系列之十四: 将 SAP Business Application Studio 里开发好的 Node.js 应用部署到 Cloud Foundry 环境中

本教程详细介绍了如何将SAP Business Application Studio中的Node.js应用部署到Cloud Foundry环境。在完成本地开发和测试后,通过cf login命令连接Cloud Foundry环境,配置manifest.yml文件指定应用参数和路由信息。使用cf push命令完成应用的上传和部署,最终使应用运行在SAP BTP的云端环境中。教程包含从路由创建到部署验证的完整流程,确保开发者能够成功将Node.js应用发布到生产环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1070

1700人点反对的LeetCode问题,是因为太难了吗?

今天是LeetCode专题的第40篇文章,我们一起来看的是LeetCode中的71题Simplify Path,中文名是简化路径。 这题的难度是Medium,通过率是1/3左右,也是一道踩多捧少的题,一共有737个点赞,1703个反对。老实讲我觉得反对得不冤,我先卖个关子,等会来详细聊聊它为什么会被踩。 题意 题目会给定一个字符串,表示一个Unix系统下的文件路径,这个路径当中会包含一些路径的计算, 要求我们返回简化之后的结果。 在Unix系统下用/来分隔文件夹,比如/home/download/fi.

TechFlow的博客 334

游戏大厂如何解析引擎技术

本文系统解析了游戏大厂如何评估和定制游戏引擎。游戏引擎作为游戏开发的核心基础,大厂会从性能、跨平台支持、渲染能力、网络模块等8个维度进行技术解析,通过文档查勘、源码阅读、Demo测试等7个步骤深度评估。解析后通常有三种决策:直接使用、深度定制或自研重构。文章以腾讯、网易、米哈游等为例,展示了不同厂商的引擎定制策略,并分析了技术解析面临的挑战和未来趋势。最终指出,体系化的引擎技术解析是打造高质量游戏的关键,需要持续的技术投入和团队协作。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 535

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

LeetCode 87,因为题目晦涩而被点了1500+反对的搜索问题

今天是LeetCode专题第55篇文章,我们一起来看看LeetCode中的第89题 Gray Code(灰色代码)。 这题的官方难度是Medium,通过率是48.9%,点赞639,反对1545。又是一道反对比点赞多得多的题目,我个人发现其实这些反对很多的题目都有一个特点,就是题意比较晦涩,出题人的意图不太容易get到。不知道是不是老外理解能力不太行,所以都给出了这么多的反对。 我们就来看看这道题的真面目吧。 题意 题目中说gray code,灰色代码是一连串n位二进制表示的数字。这一串的...

august5291的博客 195

一网打尽身份验证与授权:深入剖析ASP.NET Core Identity在C#中的全方位实战应用

ASP.NET Core Identity 是 Microsoft 提供的一个强大且可扩展的身份验证和授权框架,用于构建基于用户账户、角色和权限的Web应用程序。它提供了用户注册、登录、密码管理、多因素认证、角色分配、授权等功能,与ASP.NET Core框架深度集成,简化了安全相关的开发工作。通过上述代码示例和注释,展示了如何安装配置Identity、自定义用户实体与数据库上下文、实现用户注册登录、管理角色与用户角色关系,以及如何使用授权策略保护应用程序资源。,并指定用户和角色类型以及主键类型。

java专栏 1526

new file()的路径能用中文吗_1700人点反对的LeetCode问题,是因为太难了吗?

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是LeetCode专题的第40篇文章,我们一起来看的是LeetCode中的71题Simplify Path,中文名是简化路径。这题的难度是Medium,通过率是1/3左右,也是一道踩多捧少的题,一共有737个点赞,1703个反对。老实讲我觉得反对得不冤,我先卖个关子,等会来详细聊聊它为什么会被踩。题意题目会给定一个字符串,表示一个Uni...

weixin_39650994的博客 305

群晖、飞牛NAS容器进入终端失败?一步步教你解决Docker Bash错误!(OCI runtime exec failed: exec failed)

群晖、飞牛NAS容器进入终端失败?一步步教你解决Docker Bash错误!(OCI runtime exec failed: exec failed)

XiaoqiangClub的博客 2987

深入解析:使用Python进行T矩阵散射计算的完整指南

在物理学和工程学中,散射是一个至关重要的概念。当波(无论是光波、声波还是其他类型的波)遇到一个障碍物时,它会在多个方向上散开。为了理解和预测这种行为,我们需要进行数学建模和计算。其中,T矩阵方法是一种非常有效的工具。在开始计算之前,我们需要定义一些基础函数。"""计算T矩阵的一个元素。参数:- wave_vector: 波矢- scatterer_position: 散射体的位置- scatterer_properties: 散射体的性质(如大小、形状等)返回:- T矩阵的一个元素。

qq_38334677的博客 1051

最少点字典序最短路径_LeetCode 89,因为题目晦涩而被点了1500+反对的搜索问题...

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是LeetCode专题第55篇文章,我们一起来看看LeetCode中的第89题 Gray Code(格雷代码)。这题的官方难度是Medium,通过率是48.9%,点赞639,反对1545。又是一道反对比点赞多得多的题目,我个人发现其实这些反对很多的题目都有一个特点,就是题意比较晦涩,出题人的意图不太容易get到。不知道是不是老外理解能力...

weixin_39846664的博客 333

SY6982C 7.4V锂电池1A充电模块原理图设计,已量产

在手持设备、便携工具与小型无人机等场景中,7.4V(2S)锂聚合物电池的应用愈发广泛。这类电池对充电系统的安全性、效率与兼容性提出了明确要求:需支持 USB 5V 输入、1A 安全充电,同时具备多重保护机制。本文将结合一款基于 SY6982C 的充电原理图,深入解析其电路设计与技术亮点。

不脱发的程序猿 359

一道被点了 1500+ 反对的算法题

点击上方蓝字,关注并星标,和我一起学技术。今天是LeetCode专题第55篇文章,我们一起来看看LeetCode中的第89题 Gray Code(灰色代码)。这题的官方难度是Medium...

程序员吴师兄的博客 246

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《LeetCode力扣练习》第169题 多数元素 Java

《LeetCode力扣练习》第169题 多数元素 Java 一、资源 题目: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:[3,2,3] 输出:3 示例 2: 输入:[2,2,1,1,1,2,2] 输出:2 进阶: 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。 来源:力扣(LeetCode) 链接:https://leetcod

XRT_knives的博客 313

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Leetcode】目前300题,大部分二刷,总感觉自己是在背答案一样,怎么破?

2,上面那个状态,我个人认为,至少需要持续到300题以上,才能缓解,因为这阶段都是在“学习”,不是“刷题”,但是你刷了300+,你就会初步的算法思维和写码能力,那么这个时候,很多算法你也会了明白了,这个时候就快了,差不多20-30分钟能解决一个题目。不重复的题,就做过过千了。所以现在回想起来当年第一遍刷,感觉费了那么多时间想这些,真的是浪费时间,因为想题想思路是重要的,但不应该把时间花在想的是这些已有的固定方法数据结构上,如果做这道题之前就知道了数据结构,知道了算法,那么我至少应该有个想的方向。

2301_79456272的博客 2050

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LeetCode 79,这道走迷宫问题为什么不能用宽搜呢?

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第48篇文章,我们一起来看看LeetCode当中的第79题,搜索单词(Word Search)。 这一题官方给的难度是Medium,通过率是34.5%,点赞3488,反对170。单从这份数据上来看,这题的质量很高,并且难度比之前的题目稍稍大一些。我个人觉得通过率是比官方给的题目难得更有参考意义的指标,10%到20%可以认为是较难的题,30%左右是偏难的题。50%是偏易题,所以如果看到某题标着Hard,但是通过率有50%,

TechFlow的博客 328

LeetCode 75,90%的人想不出最佳解的简单题

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的44篇文章,我们一起来看下LeetCode的75题,颜色排序 Sort Colors。 这题的官方难度是Medium,通过率是45%,点赞2955,反对209(国际版数据),从这份数据上我们大概能看得出来,这题的难度不大,并且点赞远远高于反对,说明题目的质量很不错。事实上也的确如此,这题足够简单也足够有趣,值得一做。 题意 给定一个n个元素的数组,数组当中的每一个元素表示一个颜色。一共有红白蓝三种颜色,分别用0,1

TechFlow的博客 489

力扣刷题笔记1005

题号: 1005. K 次取反后最大化的数组和 简介:给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。) 以这种方式修改数组后,返回数组可能的最大和。 示例 1: 输入:A = [4,2,3], K = 1 输出:5 解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。 示例 2: 输入:A = [3,-1,0,2], K = 3 输出:6 解释:选择索引 (1, 2, 2

qq_51088445的博客 236

典型的几道数组题(leetcode easy)

典型的几道数组题(leetcode easy) 1.多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素 输入: [2,2,1,1,1,2,2] 输出: 2 class Solution { public int majorityElement(int[] nums) { int count=1; int cand=nums[0]; for(i

jiohfgj的博客 311
上一篇: 动态规划两题连刷,移动下标的小技巧
下一篇: Python一切皆是对象,但这和内存管理有什么关系?
TechFlow
博客等级 码龄7年 347粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值