最优算法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;elsereturn false;}elsereturn 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;  // 不能同时存在两个ehasE = 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyexcel 动态列导出

1. 引入easyexcel <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency> 2.导出write public void export(HttpServletResponse response) {try {String f…

c++中有哪些常用的关键字

C中有许多常用的关键字&#xff0c;这些关键字在编程中扮演着重要的角色。以下是一些C中常用的关键字及其基本用途&#xff1a; 数据类型相关&#xff1a; bool&#xff1a;布尔类型&#xff0c;用于表示真或假。true 和 false&#xff1a;是 bool 类型的字面量&#xff0c;分…

基于ArrayList实现简单洗牌

前言 在之前的那篇文章中&#xff0c;我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此&#xff0c;便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间&#xff0c;并且可以动态扩容&#xff0c;是一个动态类型的顺序表&…

Java方法的参数传递机制与递归总结

文章目录 1、方法的参数传递机制1.1、形参和实参1.2、 参数传递机制&#xff1a;值传递1.3、 举例1.4 练习 2、 递归(recursion)方法 1、方法的参数传递机制 1.1、形参和实参 若方法含有参数&#xff1a; 形参&#xff08;formal parameter&#xff09;&#xff1a;在定义方…

QT背景介绍

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT背景 1.1什么是QT 1.2QT的发展历史 1.3什么是框架、库 1.4QT支持的平台 1.5QT的优点 1.6QT的…

BIM转Power BI数据集

在本博客中&#xff0c;我们将了解如何使用从 SSAS 表格、Power BI Desktop 或 Power BI 服务数据集中提取的 Model.bim 文件在本地或 PBI 服务上生成新数据集。 1、设置&#xff08;SSAS 表格和 PBI 服务通用&#xff09; 我建议你创建一个专门用于此任务的新 Python 环境&a…

old photo老照片图像复原数据集

来源 本来想拿DA-CLIP 训练一下old photo&#xff0c;训练代码没成功&#xff0c;毕设没时间就不研究了 github搜old photo复原论文原作者好像没开源训练数据集&#xff0c;所以用了这个SynOld 训练集500对测试集200对 但是readme写的很差&#xff0c;其他什么也没交代 展示…

Centos-Linux安装部署MySQL-8.0

linux搭建mysql 1.使用系统的root账户 2.切换到 /usr/local 目录下 3.下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz也可以直接在官方下载最新版本 官方下载 选择linux 4.解压mysql tar xvJf mysql-8.0.21-l…

【MySQL】MySQL事务的问题:脏读、幻读、不可重复读

MySQL事务的问题&#xff1a;脏读、幻读、不可重复读 在上一篇文章中&#xff0c;我们已经学习过了事务相关的基础知识&#xff0c;今天&#xff0c;我们继续学习事务有可能带来的一些问题。其实在一次请求和连接中&#xff0c;事务是不会出现什么问题的&#xff0c;毕竟在一个…

C易错注意之const修饰指针,含char类型计算,位段及相关经典易错例题

目录 前言 一&#xff1a;const修饰指针 1.const修饰变量 2.const 修饰指针 1.const int*p&m; 2. int* const p&m; 3. int const *p&m; 4. int const *const p&m; 5.总结 总之一句话为&#xff1a;左定值有定向 二&#xff1a;关于计算中char类型…

Windows创建远程线程学习

CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程; 下面来简单做一下,配合procexp工具; VC代码如下,我是写到一个菜单单击处理函数中, void CCrrmthView::OnMenuitem32771() {// TODO: Add your command handler code hereHAN…

C语言:动态内存管理(二)

目录 前言 1.3 realloc​编辑 3、常见动态内存管理错误 3.1 对空指针的解引用操作 3.2 对动态开辟的空间进行越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态内存开辟的一部分 3.5 对同一块空间的多次释放 3.6 动态内存开辟之后忘记释放 总结 前…

杨氏矩阵(C语言)

文章目录 问题技术名词解释思路关键代码运行代码 问题 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N); 技术名词解释 杨氏矩阵&…

自动化测试框架Robot Framework入门

什么是RF RF是一个基于 Python 的、可扩展的关键字驱动的自动化 验收测试框架、验收测试驱动开发 &#xff08;ATDD&#xff09;、 行为驱动开发 &#xff08;BDD&#xff09; 和机器人流程自动化 &#xff08;RPA&#xff09;。它 可用于分布式、异构环境&#xff0c;其中自动…

Spring Security——04,认证_校验

认证_校验 一、认证过滤器二、配置过滤器三、测试过滤器3.1 登录接口3.2 非登录接口3.3 结果 一键三连有没有捏~~ 一、认证过滤器 创建一个filter包&#xff0c;创建一个过滤器 代码如下&#xff1a; Component public class JwtAuthenticationTokenFilter extends OncePerR…

LeetCode | 数组 | 双指针法 | 27. 移除元素【C++】

题目链接 1. 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改 这一次G老师不好使了 在集群中使用deepspeed默认的端口号29500被占用&#xff0c;显示更改居然不起作用 G老师给的方法也不好使 #!/bin/bash MASTER_ADDRlocalhost MASTER_PORT29501 # 选择一个未被占用的端…

Android+OnnxRuntime+Opencv+Onnx模型操作图片擦除多余内容

今年来AI的发展非常迅速,在工业、医疗等等行业逐渐出现相应的解决方案,AI也逐渐成为各行业基础设施建设重要的一环,未来发展的大趋势,不过这也需要一个漫长的过程,需要很多技术型人才加入其中,除了工业设施的基础建设,在娱乐方向也有很多有趣的能力,不如图片/视频换背景…

mysql 运算符 语句 字符集 校队集

mysql 运算符 使用select语句可以输出运算的结果 mysql标识符不区分大小写 算数运算符 1./除法 得到的结果是一个小数 %是整数,省略小数 2、除以0不会报错,得到的结果是 null 3.数宇和字符串做加法运算,并不会拼接 比较运算符 1.mysql里面的=是比较运算符,而不是赋值运算…

lora pingpang系统 4

1 深入了解LoRa技术原理 1.1 LoRa扩频通信原理 1.1.1 模拟无线通信&#xff1a; 模拟无线通信是一种使用模拟信号传输数据的通信方式。这种通信方式已经被数字无线通信所取代&#xff0c;因为数字通信具有更高的效率和可靠性。 天线&#xff1a;从空中接收到的无线电波转换成…