065.有效数字
作者:沉默王二
发布时间:2022-12-01T14:50:02.476+0800
本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I
题意
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 下述格式之一:
- 至少一位数字,后面跟着一个点 '.'
- 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
- 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
难度
困难
示例
示例 1:
输入:s = "0"
示例 2:
输入:s = "e"
示例 2:
输入:s = "."
分析
看着这么多的限制条件,是不是一下子就被冲昏了头?
别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。
判断有效数字,我们先从最基础的开始——判断是否是整数。
要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:
- 至少有一位数字
- 可以有一个符号('+' 或 '-')
- 不存在任何数字以外的其他字符
这样子我们就可以写出如下的代码:
boolean isInteger(String str){
for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum;}
下一步就是判断小数了,我们照样可以提炼出几个要素:
- 要有小数点.
- 小数点前后至少得有一边有数字
- 可以有一个符号('+' 或 '-')
- 不存在任何数字以外的其他字符
这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改造,便可以得出一个用来判断是否为数字的方法了。
boolean isNum(String str,boolean mustInt){
for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) == '.'){ if(haveDot || mustInt) return false; haveDot = true; } else if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum;}
这时候就只剩下了这个E的问题了,不慌,我们继续分析。
如果没有E的话,那么我们只需要判断整个字符串是否为整数或者小数即可。
如果有的话,我们则根据E的位置将整个字符串分成两块,一块是E前面的,这部分可以是整数也可以是小数,也可以没有,另外一块则是E后面的,这部分的话,必须是整数。
这样子我们就把整个模拟的过程给理顺了:
class Solution {
int size = s.length(); int ePos = -1; for(int i = 0;i < size;i++){ boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e'; if(b && ePos == -1){ ePos = i; continue; } else if(b){ return false; } } if(ePos == -1 || ePos == 0){ return isNum(s,false); } else{ return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos + 1),true); } } private boolean isNum(String str,boolean mustInt){ boolean haveDot = false,haveNum = false; for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) == '.'){ if(haveDot || mustInt) return false; haveDot = true; } else if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum; }}
总结
其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如此。
力扣链接:https://leetcode.cn/problems/valid-number/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1000 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I
题意
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 下述格式之一:
- 至少一位数字,后面跟着一个点 '.'
- 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
- 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
难度
困难
示例
示例 1:
输入:s = "0"
示例 2:
输入:s = "e"
示例 2:
输入:s = "."
分析
看着这么多的限制条件,是不是一下子就被冲昏了头?
别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。
判断有效数字,我们先从最基础的开始——判断是否是整数。
要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:
- 至少有一位数字
- 可以有一个符号('+' 或 '-')
- 不存在任何数字以外的其他字符
这样子我们就可以写出如下的代码:
boolean isInteger(String str){
for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum;}
下一步就是判断小数了,我们照样可以提炼出几个要素:
- 要有小数点.
- 小数点前后至少得有一边有数字
- 可以有一个符号('+' 或 '-')
- 不存在任何数字以外的其他字符
这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改造,便可以得出一个用来判断是否为数字的方法了。
boolean isNum(String str,boolean mustInt){
for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) == '.'){ if(haveDot || mustInt) return false; haveDot = true; } else if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum;}
这时候就只剩下了这个E的问题了,不慌,我们继续分析。
如果没有E的话,那么我们只需要判断整个字符串是否为整数或者小数即可。
如果有的话,我们则根据E的位置将整个字符串分成两块,一块是E前面的,这部分可以是整数也可以是小数,也可以没有,另外一块则是E后面的,这部分的话,必须是整数。
这样子我们就把整个模拟的过程给理顺了:
class Solution {
int size = s.length(); int ePos = -1; for(int i = 0;i < size;i++){ boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e'; if(b && ePos == -1){ ePos = i; continue; } else if(b){ return false; } } if(ePos == -1 || ePos == 0){ return isNum(s,false); } else{ return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos + 1),true); } } private boolean isNum(String str,boolean mustInt){ boolean haveDot = false,haveNum = false; for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) == '.'){ if(haveDot || mustInt) return false; haveDot = true; } else if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum; }}
总结
其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如此。
力扣链接:https://leetcode.cn/problems/valid-number/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1000 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I
题意
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 下述格式之一:
- 至少一位数字,后面跟着一个点 '.'
- 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
- 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
难度
困难
示例
示例 1:
输入:s = "0"
示例 2:
输入:s = "e"
示例 2:
输入:s = "."
分析
看着这么多的限制条件,是不是一下子就被冲昏了头?
别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。
判断有效数字,我们先从最基础的开始——判断是否是整数。
要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:
- 至少有一位数字
- 可以有一个符号('+' 或 '-')
- 不存在任何数字以外的其他字符
这样子我们就可以写出如下的代码:
boolean isInteger(String str){
for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum;}
下一步就是判断小数了,我们照样可以提炼出几个要素:
- 要有小数点.
- 小数点前后至少得有一边有数字
- 可以有一个符号('+' 或 '-')
- 不存在任何数字以外的其他字符
这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改造,便可以得出一个用来判断是否为数字的方法了。
boolean isNum(String str,boolean mustInt){
for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) == '.'){ if(haveDot || mustInt) return false; haveDot = true; } else if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum;}
这时候就只剩下了这个E的问题了,不慌,我们继续分析。
如果没有E的话,那么我们只需要判断整个字符串是否为整数或者小数即可。
如果有的话,我们则根据E的位置将整个字符串分成两块,一块是E前面的,这部分可以是整数也可以是小数,也可以没有,另外一块则是E后面的,这部分的话,必须是整数。
这样子我们就把整个模拟的过程给理顺了:
class Solution {
int size = s.length(); int ePos = -1; for(int i = 0;i < size;i++){ boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e'; if(b && ePos == -1){ ePos = i; continue; } else if(b){ return false; } } if(ePos == -1 || ePos == 0){ return isNum(s,false); } else{ return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos + 1),true); } } private boolean isNum(String str,boolean mustInt){ boolean haveDot = false,haveNum = false; for(int i = 0;i < str.length();i++){ if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){ continue; } if(str.charAt(i) == '.'){ if(haveDot || mustInt) return false; haveDot = true; } else if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){ haveNum = true; } else return false; } return haveNum; }}
总结
其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如此。
力扣链接:https://leetcode.cn/problems/valid-number/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1000 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
知识星球
扫码加入星球
查看更多优质内容
https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412