最优算法100例之30-表示数值的字符串

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章icon-default.png?t=N7T8https://blog.csdn.net/seeker1994/category_12585732.html

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

题解报告

编译原理状态机

# include <iostream>
# include <string>
using namespace std;
bool IsNum(char ch){
    if(ch<'0'||ch>'9') 
		return false;
    else 
		return true;
}
bool isNumeric(char* str){
    int i = 0;
    if(!(str[i] == '+' || str[i] == '-' || IsNum(str[i])) )
		return false;
	else{
		i++;
        while(IsNum(str[i]) && str[i] != '\0')
			i++; //如果是数字一直往后找
		if(str[i] == '\0'){
			return true;
		} 
        else if(str[i] == '.'){
        	i++;
        	if(str[i] == '\0')
				return true;
            else if(IsNum(str[i])){
                while(str[++i]!='\0' && IsNum(str[i]));
                if(str[i]=='e'||str[i]=='E'){
                    i++;
                    if(str[i]=='+' || str[i]=='-' || IsNum(str[i])){
                        while(str[++i]!='\0' && IsNum(str[i]));
                        if(str[i]=='\0')
							return true;
                        else
							return false;
                    }else
						return false;
                }else if(str[i]=='\0'){
                	return true;
				}else{
					return false;
				}		
            }else{
            	return false;
			}
        }else if(str[i]=='e'||str[i]=='E'){
            i++;
            if(str[i]=='+' || str[i]=='-' || IsNum(str[i])){
                while(str[++i]!='\0' && IsNum(str[i]));
                if(str[i]=='\0') return true;
                else return false;
            }else return false;
        }	
        else{
        	return false; 
		}	         
    }
}
int main(){
	char str[] = "1.25";
	if(isNumeric(str)){
		cout<<"YES"<<endl; 
	}else{
		cout<<"NO"<<endl;
	}
	return 0;
}
优化后的代码,使用状态表:
# include <iostream>
# include <string>
using namespace std;
char arr[10] = "+-n.ne+-n";
int turn[10][9] = {
   //+  -  n  .  n  e  +  -  n
    {1, 1, 1, 0, 0, 0, 0, 0, 0},    // # start
    {0, 0, 1, 1, 0, 0, 0, 0, 0},    // +
    {0, 0, 1, 1, 0, 0, 0, 0, 0},    // -
    {0, 0, 1, 1, 0, 1, 0, 0, 0},    // n
    {0, 0, 0, 0, 1, 0, 0, 0, 0},    // .
    {0, 0, 0, 0, 1, 1, 0, 0, 0},    // n
    {0, 0, 0, 0, 0, 0, 1, 1, 1},    // e
    {0, 0, 0, 0, 0, 0, 0, 0, 1},    // +
    {0, 0, 0, 0, 0, 0, 0, 0, 1},    // -
    {0, 0, 0, 0, 0, 0, 0, 0, 1}     // n
};
bool isNumeric(char* string) {
    int cur = 0,i,j;
    for(i = 0; string[i]; i++) {
        for(j = 0; j < 9; j++) {
            if(turn[cur][j]) {//状态转移 
            	//状态转移 
                if(('0' <= string[i] && string[i] <= '9' && arr[j] == 'n') ||
                    (string[i] == 'E' && arr[j] == 'e') ||
                    string[i] == arr[j]) {
                    cur = j + 1;
                    break;
                }
            }
        }
        if(j == 9)
			return false;
    }
    if(cur == 3 || cur == 4 || cur == 5 || cur == 9)
       return true;
    return false;
}
int main(){
	char str[] = "1.25";
	if(isNumeric(str)){
		cout<<"YES"<<endl; 
	}else{
		cout<<"NO"<<endl;
	}
	return 0;
}

#1正则
public boolean isNumeric(char[] str) {
    String string = String.valueOf(str);
    return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
}
//标记法
bool isNumeric(char* str) {
    // 标记符号、小数点、e是否出现过
    bool sign = false, decimal = false, hasE = false;
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] == 'e' || str[i] == 'E') {
            if (i == strlen(str)-1) return false; // e后面一定要接数字
            if (hasE) return false;  // 不能同时存在两个e
            hasE = true;
        } else if (str[i] == '+' || str[i] == '-') {
            // 第二次出现+-符号,则必须紧接在e之后
            if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false;
            // 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后
            if (!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') return false;
            sign = true;
        } else if (str[i] == '.') {
          // e后面不能接小数点,小数点不能出现两次
            if (hasE || decimal) return false;
            decimal = true;
        } else if (str[i] < '0' || str[i] > '9') //不合法字符
            return false;
    }
    return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【35分钟掌握金融风控策略3】场景概述3

目录 ​编辑 场景概述 贷前、贷中、贷后的划分及对应的风控场景 贷前风控场景简介 预授信 授信审批 定额 定价 人工审核 场景概述 贷前、贷中、贷后的划分及对应的风控场景 在金融风控全生命周期中&#xff0c;贷前主要是指授信成功及之前的阶段、贷中主要是指授信成…

链表的应用

⽬录 1. 单链表经典算法OJ题⽬ 1.1 单链表相关经典算法OJ题1&#xff1a;移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ typedef …

基于opencv的猫脸识别模型

opencv介绍 OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发&#xff0c;以BSD许可证授权发行&#xff0c;可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及…

ctf刷题记录2(更新中)

因为csdn上内容过多编辑的时候会很卡&#xff0c;因此重开一篇&#xff0c;继续刷题之旅。 NewStarCTF 2023 WEEK3 Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $…

解锁金融数据中心场景,实现国产化AD替代,宁盾身份域管为信创电脑、应用提供统一管理

随着信创国产化改造持续推进&#xff0c;越来越多的金融机构不断采购信创服务器、PC、办公软件等&#xff0c;其 IT 基础设施逐渐迁移至国产化 IT 架构下。为支撑国产化 IT 基础设施的正常使用和集中管理运维&#xff0c;某金融机构数据中心的微软Active Directory&#xff08;…

二、GitLab相关操作

GitLab相关操作 一、组、用户、项目管理1.创建组2.创建项目3.创建用户并分配组3.1 创建用户3.2 设置密码3.3 给用户分配组 二、拉取/推送代码1.配置ssh(第一次需要)1.1 创建一个空文件夹1.2 配置本地仓账号和邮箱1.3 生成ssh公钥密钥1.4 gitlab配置公钥 2.拉取代码3.推送代码3.…

FastAPI Web框架教程 第10章 APIRouter

10-1 APIRouter基本使用 需求场景 如果我们写一个网站&#xff0c;或者写一个APP&#xff0c;那整个项目应该是比较复杂的&#xff0c;此时不应该把所有代码放在一个文件中。 前几节课&#xff0c;我们通过把代码拆分到不同文件的方式&#xff0c;可以解决一些代码混乱的问题…

SD-WAN帮助企业实现对分布式网络的集中管理和控制

在当今数字化时代&#xff0c;企业网络越来越分散和复杂&#xff0c;分布在全球不同地点的分支机构和远程办公地点需要高效的网络连接来支持业务运营。传统的广域网&#xff08;WAN&#xff09;架构已经无法满足企业对网络灵活性、可靠性和安全性的需求。而SD-WAN的出现为解决这…

Phpstorm配置Xdebug

步骤 1、先去官网找到对应的php xdebug的版本 2、配置phpstorm断点调试 网址&#xff1a;https://xdebug.org/ 查看php对应的xdebug版本&#xff1a;Xdebug: Support — Tailored Installation Instructions 1.1查看对应php xdebug版本 全选&#xff0c;复制到目标网址 我…

C++要点细细梳理(上)(函数与面向对象)

之前我们讨论了C语言一些基础的细节&#xff0c;下面我们开始讨论C&#xff0c;&#xff0c;后面我打算接着谈C&#xff0c;也就是C#&#xff0c;先在此留个坑。 注意&#xff0c;本文有素材来自中国大学MOOC的C课程&#xff0c;本文也是该课程的听课笔记【这是链接】 1. 从C…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画&#xff0c;当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时&#xff0c;可以实现渐变过渡效果。…

模块化编程:AMD 和 CMD 的魅力

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

力扣刷题部分笔记

Leetcode 力扣刷题笔记&#xff0c;记录了几个月来的题目记录&#xff0c;将会继续保持刷题~ 2024.01 1768.交替合并字符串 创建字符串不需要声明长度&#xff08;动态分配内存&#xff09;&#xff0c;push_back()可以加入某个字符&#xff0c;append()一般用于添加字符串…

js的qq换肤效果

文章目录 1. 演示效果2. 分析思路3. 代码实现3.1. 方式一3.2. 方式二3.3. 整体代码 1. 演示效果 2. 分析思路 先编写样式&#xff0c;弄好布局和排版。遍历这个集合&#xff0c;对每个图片元素&#xff08;img&#xff09;添加一个点击事件监听器。可以使用 for 或者 forEach …

IT外包服务:企业数据资产化加速利器

随着数字化时代的兴起&#xff0c;数据成为企业最为重要的资源之一。数据驱动创新对于企业的竞争力和可持续发展至关重要。在这一进程中&#xff0c;IT外包服务发挥着关键作用&#xff0c;加速企业数据资产化进程&#xff0c;为企业提供了重要支持。 首先&#xff0c;IT外包服务…

c++11 标准模板(STL)本地化库 - 平面类别 - (std::ctype) 定义字符分类表(四)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义字符分类表 std::ctype template< class CharT > clas…

计算机网络(五) 传输层

传输层 一、传输层概述二、TCP1.报文段格式2.连接管理3.可靠传输4.流量控制5.拥塞控制 三、UDP1.报文段格式2.校验 一、传输层概述 从通信和信息处理的角度看&#xff0c;传输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功…

微信小程序纯CSS实现好看的加载动画

进入下面小程序可以体验效果&#xff1a; WXML: <wxs module"img" src"./loading.wxs"></wxs> <view class"loading-container {{show?:loading-container-hide}}"><view class"loading-mask" wx:if"{{ma…

LNMP环境:揭秘负载均衡与高可用性设计

lb1: 192.168.8.5 lb2: 192.168.8.6 web1:192.168.8.7 web2:192.168.8.8 php-fpm: 192.168.8.9 mysql: 192.168.8.10 nfs:192.168.8.11 分别插入镜像 8.5-8.8 分别安装nginx,并设置启动 8.9 安装php 8.10 安装mysql 先配置一台web服务器然后同步 设置网站根目录 cp -…

WebGL BabylonJS GUI 如何创建连接模型的按钮

如图所示&#xff1a; 方法&#xff1a; createGUI(mesh: BABYLON.Mesh, title: string, index: number) {const advancedTexture AdvancedDynamicTexture.CreateFullscreenUI(UI)const rect new Rectangle()rect.width 100pxrect.height 40pxrect.thickness 0advancedT…