前言

题目来源:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

这个题目有官方解释的有限状态自动机,也有用正则肝的,甚至有暴躁老哥打算直接把这题撕了的,但是,还得是评论区里人才多,总有大佬能肝出来清晰的题解,这波记录一下,食用这个题目的过程。



大佬讲解链接:https://www.bilibili.com/video/BV1KP411L7VH/?p=20&vd_source=a3808e6f1547cd8a5765ed7361e92529

一、憨憨初解

1、思路

看完题目感觉没什么难的,字符串处理题么应该是,从字符串开始到最后遍历就完事儿,用cur记录遍历的长度,如果最后能够按照题目给的规则遍历完,那么cur就等于字符串的长度就返回true,否则false

2、代码

class Solution {
public:
bool isNumber(string s) {
if (s.empty() || s.size() == 0) return false;
int cur=0;
while(s[cur] == ' ') cur++;//去调首部空格
//处理一个整数或者小数
if(s[cur] == '+' || s[cur] == '-') cur++;
while(s[cur] >= '0' && s[cur] <= '9') cur++;
if(s[cur] == '.') cur++;
while(s[cur] >= '0' && s[cur] <= '9') cur++; //处理e和E以及一个整数
if(s[cur]=='e' || s[cur]=='E') cur++;
if(s[cur] == '+' || s[cur] == '-') cur++;
while(s[cur] >= '0' && s[cur] <= '9') cur++; while(s[cur] == ' ') cur++;//处理尾部空格
return cur==s.size();
}
};

3、战绩

4、反思

存在一些情况没有考虑,憨憨我直接一波下去了,看题解看的有点懵,然后看大佬视频题解后,理解了思路,自己用C++复现了一波;

二、看懂再解

1、思路

首先判断为空字符串的返回false,然后用trim去除段首段尾空格;

定义三个标准布尔量,分别表示数字和点还要e或者E是否出现过,从开始到结尾进行遍历,如果出现了不符合标准的情况就返回false。

这个不符合标准的情况规律是大佬以身探出来的,感恩一下前人,自己很难严谨的考虑到这些东西。

1、小数点出现的时候,前面不能出现过小数点或者是出现过e;

  • 解释:'.'只能在底数上,不能在指数上,且只能出现一次,'.'两边任一边有数字均算一个完整的数字,但单独一个'.'不行。

2、e或者E出现的时候,前面不能出现过eE,并且必须出现过一个数字;

  • 解释:e、E用来划分底数与指数,只能出现一次,前面为科学计数法的底数,后面为指数;

3、+-符号,只能出现在第一位或者紧接e后面;

  • 解释:'+'、'-'只能作为正负号出现在底数和指数的前面,不能出现在两个数字中间;

特别需要注意的是为了避免123e这种请求,出现e之后就标志is_num为false,最后返回is_num即可!

其实不用看解释,理解即可,记好这三条规律和一个特别的情况就能快速的编写出解题代码!

2、代码

复现的C++版:

class Solution {
public:
static void trim(string &s){
if( !s.empty() ){
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
}
}
bool isNumber(string s) {
if (s.empty() || s.size() == 0) return false;
trim(s);
bool is_num = false;//判断数字是否出现过
bool is_dot = false;//判断.是否出现过
bool is_eorE = false;//判断e或者E是否出现过
int i = 0,size = s.size();
for (; i < size; i++) {
//判定为数字,则标记is_num
if (s[i] >= '0' && s[i] <= '9') {
is_num = true;
//判定为. 需要前面没出现过.并且没出现过e
} else if (s[i] == '.' && !is_dot && !is_eorE) {
is_dot = true;
//判定为e或者E,需要前面没出现过e,并且出现过数字
} else if ((s[i]=='e' || s[i]=='E') && !is_eorE && is_num) {
is_eorE = true;
is_num = false;//为了避免123e这种请求,出现e之后就标志为false
//判定为+-符号,只能出现在第一位或者紧接e后面
} else if (s[i] == '-' || s[i] == '+'){
if(i!=0 && s[i-1] != 'e' && s[i-1] != 'E'){
return false;
}
} else {
return false;
}
}
return is_num;
}
};

大佬的Java版:

class Solution {
public boolean isNumber(String s) {
//有限状态机
// 2.小数点 3.E/e 4. 数字字符 5. -+
if(s == null || s.length() <= 0){
return false;
}
char[] res = s.trim().toCharArray();
if(res.length <= 0) return false; int n = res.length; boolean is_dot = false;
boolean is_e_or_E = false;
boolean is_num = false;
for(int i = 0; i < n; i++){
if(res[i] >= '0' && res[i] <= '9'){
is_num = true;
} else if(res[i] == '.'){
//-+ 8. 8.8 .8
// 前面:不能有重复的小数点,也不能出现 e/E
if(is_dot || is_e_or_E){
return false;
}
is_dot = true;
} else if(res[i] == 'e' || res[i] == 'E'){
// 前面必须要有一个数字 || 前面不能出现重复的 e/E
if(is_e_or_E || !is_num){
return false;
}
is_e_or_E = true;
is_num =false;//11E+ 11E
} else if(res[i] == '-' || res[i] == '+'){
if(i!=0 && res[i-1] != 'e' && res[i-1] != 'E'){
return false;
}
} else {
return false;
}
} return is_num;
}
}

3、C++版战绩

总结

高情商:考察编程代码严谨能力!

低情商:不太想要你。

开玩笑的蛤,不要太当真,不管什么问题,都要能够具备解决它的能力,这题虽然比较难受,但是还是学到了一点东西的。

发现了一个宝藏博主:https://www.cnblogs.com/Shirlies/p/4666744.html

大佬题解页面:https://www.playoffer.cn/84.html

剑指offer20题表示数值的字符串:这题实在是太优雅了的更多相关文章

  1. 剑指 Offer 20. 表示数值的字符串 + 有限状态自动机

    剑指 Offer 20. 表示数值的字符串 Offer 20 常规解法: 题目解题思路:需要注意几种情况: 输入的字符串前后可能有任意多个空格,这是合法的. 正负号: (1)正负号只能出现一次. (2 ...

  2. 剑指 Offer 58 - II. 左旋转字符串 + 简单题

    剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGar ...

  3. 【Java】 剑指offer(20) 表示数值的字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...

  4. Go语言实现:【剑指offer】表示数值的字符串

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2",&qu ...

  5. 剑指offer53:表示数值的字符串,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是

    1 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3 ...

  6. 剑指offer——22表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  7. 剑指Offer 53. 表示数值的字符串 (字符串)

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  8. 《剑指offer》-表示数值的字符串

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...

  9. [剑指Offer] 53.表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  10. [剑指offer] 53. 表达数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

随机推荐

  1. 2022-08-15 - 初识MySQL

    MySQL数据库 数据库 数据库,又称为Database,简称DB.数据库就是一个文件集合. 顾名思义:是一个存储数据的仓库,实际上就是一堆文件,这些文件中存储了具有特定格式的数据,可以很方便的对里面 ...

  2. 关于Redis在windows上运行及fork函数问题

    Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成.微软的一些工程师花费时间在解决在 ...

  3. 刷题记录:Codeforces Round #725 (Div. 3)

    Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...

  4. Util和Helper类

    Util和Helper Util Util类,应该是一个无状态的类,只有静态方法. 比如在获取某些类的全局实例化对象的时候可以使用. public class ParamUtil { ... publ ...

  5. React的生命周期函数

    概述 在React中,生命周期函数指的是组件在某一个时刻会自动执行的函数 constructor 在类或组件创建的时候被自动执行,我们可以说它是生命周期函数,但它并不是React所特有的,所有的Es6 ...

  6. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者,再识AutoResponder标签-上篇

    1.简介 Fiddler充当第三者,主要是通过AutoResponder标签在客户端和服务端之间,Fiddler抓包,然后改包,最后发送.AutoResponder这个功能可以算的上是Fiddler最 ...

  7. WebGPU实现Ray Packet

    大家好~本文在如何用WebGPU流畅渲染百万级2D物体?基础上进行优化,使用WebGPU实现了Ray Packet,也就是将8*8=64条射线作为一个Packet一起去访问BVH的节点.这样做的好处是 ...

  8. 第八十九篇:Vue 重学插槽slot

    好家伙, 1.什么是插槽? 插槽是vue为组件的封装者提供的能力.允许开发者在封装组件时, 把不确定的,希望由用户指定的部分定义为插槽   我们依然可以把它理解为一个占位符 1.1.插槽的基本用法 试 ...

  9. 如何结合整洁架构和MVP模式提升前端开发体验(三) - 项目工程化配置、规范篇

    工程化配置 还是开发体验的问题,跟开发体验有关的项目配置无非就是使用 eslint.prettier.stylelint 统一代码风格. formatting and lint eslint.pret ...

  10. 2021年3月-第02阶段-前端基础-Flex 伸缩布局-移动WEB开发_flex布局

    移动web开发--flex布局 1.0 传统布局和flex布局对比 1.1 传统布局 兼容性好 布局繁琐 局限性,不能再移动端很好的布局 1.2 flex布局 操作方便,布局极其简单,移动端使用比较广 ...