前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 65. 有效数字(逻辑题,难)

LeetCode 65. 有效数字(逻辑题,难)

作者头像
Michael阿明
发布2020-07-13 17:16:10
5290
发布2020-07-13 17:16:10
举报

1. 题目

验证给定的字符串是否可以解释为十进制数字。

代码语言:javascript
复制
例如:
"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
代码语言:javascript
复制
说明: 我们有意将问题陈述地比较模糊。
在实现代码之前,你应当事先思考所有可能的情况。
这里给出一份可能存在于有效十进制数字中的字符列表:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-number 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

《剑指Offer》同题:面试题20. 表示数值的字符串

2. 解题

  • 先找指数e,E的位置,将字符切分成前后2部分
  • 判断前后,都必须要有数字,不能有其他非法字符
  • 前后+ -号必须在第一位
  • 后半部不能有点.
代码语言:javascript
复制
class Solution {
public:
    bool isNumber(string s) {
    	//去除尾部空格
		while(!s.empty() && s.back() == ' ')
			s.pop_back();
		while(!s.empty() && s.front() == ' ')
			s.erase(s.begin());//忽略头部空格
		if(s.empty())
			return false;
		int idx1 = s.find('E');
		int idx2 = s.find('e');
		if(idx1 == -1 && idx2 == -1)
			return check1(s);//没有指数,直接判断数字
		if(idx1 != -1)//找到指数,分成两半检查(s1)E(s2)
			return (check1(s.substr(0,idx1)) && check2(s.substr(idx1+1)));
		else	//找到指数,分成两半检查(s1)e(s2)
			return (check1(s.substr(0,idx2)) && check2(s.substr(idx2+1)));
    }

    bool check1(string s) 
    {	//前半部分
    	if(s.empty())
    		return false;
    	int dot = 0;
    	bool number = false;
    	for(int i = 0; i < s.size(); i++)
    	{
    		if((s[i]=='+' || s[i] == '-'))
    		{	//符号不在第一位
    			if(i != 0)
    				return false;
    		}
    		else if(s[i] == '.')
    			dot++;
    		else if(isdigit(s[i]))
    			number = true;
    		else//其他字符
				return false;
    	}
    	if(dot > 1 || !number)
    		return false;
    	return true;
    }

    bool check2(string s)
    {	//检查后半部分,不能有 . 点
    	if(s.empty())
    		return false;
    	bool number = false;
    	for(int i = 0; i < s.size(); i++)
    	{
    		if((s[i]=='+' || s[i] == '-'))
    		{	//符号不在首
    			if(i != 0)
    				return false;
    		}
    		else if(s[i] == '.')//指数不能有点
    			return false;
    		else if(isdigit(s[i]))
    			number = true;
    		else//其他字符
				return false;
    	}
    	if(!number)
    		return false;
    	return true;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档