如何判断输入的是字符还是数字_[Leetgo]判断字符串是否为数字

题解分析代码实现

实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

题解分析

一个标识数字的字符串可能包括以下字符类型:

  • 空格;

  • 数组:0~9;

  • 正负号

  • 小数点

  • 幂符号:e/E;

为了解决此类问题,需要使用有限状态自动机,字符串有如下状态:

  • 0:开始的空格;

  • 1:幂符号前的正负号;

  • 2:小数点前的数字;

  • 3:小数点、小数点后的数字;

  • 4:小数点前为空格时:小数点、小数点后的数字;

  • 5:幂符号;

  • 6:幂符号后的正负号;

  • 7:幂符号后的数字;

  • 8:结尾的空格;
    合法的结束状态有:2、3、7、8。

状态转移如下图所示:

cc551a4305d6c0c3466130d9fabfa4f7.png

states

复杂度分析:

  • 时间:需要遍历整个字符串的长度,且状态转移为O(1),所以为O(N);

  • 空间:只需常数额外空间,所以为O(1);

代码实现

状态使用字典列表表示,具体实现为:

func isNumber(strNum string) bool {
    state := []map[byte]int{
        {' ':0, 's':1, 'd':2, '.':4},    // 0: start with 'blank'
        {'d':2, '.':4},                  // 1: 'sign' before e
        {'d':2, '.':3, 'e':5, ' ':8},    // 2: 'digit' before '.'
        {'d':3, 'e':5, ' ':8},           // 3: 'digit' after '.'
        {'d':3},                         // 4: 'digit' after '.'(‘blank’ before 'dot')
        {'s':6, 'd':7},                  // 5: 'e'
        {'d':7},                         // 6: 'sign' after 'e'
        {'d':7, ' ':8},                  // 7: 'digit' after e
        {' ':8},                         // 8: end with 'blank'
    }

    index := 0
    var key byte
    for _,ch := range strNum {
        if ch>='0' && ch <= '9'{
            key = 'd'
        }else {
            switch ch {
            case '+', '-':
                key = 's'
            case 'e', 'E':
                key = 'e'
            case '.', ' ':
                key = byte(ch)
            default:
                key = '?'
            }
        }

        if _,ok:=state[index][key]; !ok{
            return false
        }
        index = state[index][key]
    }

    switch index {
    case 2,3,7,8:
        return true
    default:
        return false
    }
}

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

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

相关文章

mysql语句转为sql语句_MySQL 的分页查询 SQL 语句(转)

转自 https://www.cnblogs.com/wbxk/p/10644766.htmlMySQL一般使用 LIMIT 实现分页。基本语句为&#xff1a;SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...在中小数据量的情况下&#xff0c;这样的SQL足够用了&#xff0c;唯一需要注意的问题就是确保使用了索引。举例…

mysql查询选课最少成绩最高_MySQL 练习

最近在学习MYSQL 数据库&#xff0c;在此mark 一下做过的sql 相关练习表结构如下&#xff1a;teacher表tidtnameclass表cidcaptioncourse表cidcnameteacher_idstudent表sidgenderclass_idsnamescore表sidstudent_idcourse_idnumclass :teacher : course : student :score : 根…

java 判断子类_java判断class是否是某个类的子类或父类

Class c = ArrayList.class; c.isPrimitive(); //判断c是否为基本数据类型 c.isAssignableFrom(List.class); //判断c是否是List类的子类或父类 c.getGenericType(); //得到泛型类型 免费学习视频分享:java视频教程 实例:通过反射得到List 集合中的泛型类型package com.zf.ta…

Java游戏有易筋经_易筋经- JavaWeb-1

JavaScript一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的语言&#xff0c;内置支持类型。它的解释器被称为JavaScript引擎&#xff0c;为浏览器的一部分&#xff0c;广泛用于客户端的脚本语言组成部分:ECMAScript:js基础语法(规定 关键字 运算符 语句 函数…

java导出hbase表数据_通用MapReduce程序复制HBase表数据

编写MR程序&#xff0c;让其可以适合大部分的HBase表数据导入到HBase表数据。其中包括可以设置版本数、可以设置输入表的列导入设置(选取其中某几列)、可以设置输出表的列导出设置(选取其中某几列)。原始表test1数据如下&#xff1a;每个row key都有两个版本的数据&#xff0c;…

java服务器和linux_在Linux下开一个Java服务器(使用CatServer Pro)

引言Linux开服具有快速&#xff0c;高效&#xff0c;性能等特点&#xff0c;而Windows虽然简单&#xff0c;但是不具备Linux良好的性能。本教程就说明一下简单的Linux开服方式(需要教程的人&#xff0c;如果你学会后&#xff0c;请无偿帮助更多的人。)服务器准备首先。先准备一…

我的世界java版游戏崩溃_我的世界全攻略之-游戏崩溃的解决方法

我的世界崩溃怎么办&#xff1f;下面吾爱网小编给大家带来我的世界无法正常启动的解决方法,需要的朋友可以参考下。我的世界作为许多玩家都十分喜爱的模拟经营沙盘类游戏,经常有玩家反映在玩我的世界的时候,游戏总是会出现崩溃或者无法启动的情况,玩家在遇到的时候不知道怎么办…

vue3 新项目 - 搭建路由router

创建router/index 文件 main.ts 安装 router 然后 在 app下面 去 设置 路由出口

java如何获得相反的颜色_javascript – 如何根据当前颜色生成相反的颜色?

更新&#xff1a;GitHub上的生产就绪代码.我就是这样做的&#xff1a;>将HEX转换为RGB>反转R,G和B组件>将每个组件转换回HEX>用零和输出填充每个组件.function invertColor(hex) {if (hex.indexOf(#) 0) {hex hex.slice(1);}// convert 3-digit hex to 6-digits.…

wamp php启动不成功,wamp的mysql 启动失败解决

wamp启动失败&#xff0c;查看原因是mysql 启动失败首先查看mysql的启动日志命令&#xff1a;mysqld --console知道error报错的地方&#xff1a;然后百度了此报错&#xff0c;解决方法在my.ini中添加innodb_force_recovery 1发现这个会影响insert需要设置为 innodb_force_reco…

php复选框样式,如何自定义checkbox样式?附代码

本篇文章给大家带来的内容是关于如何自定义checkbox样式&#xff1f;附代码&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。修改原生checkbox样式。效果原理1.利用CSS3属性 appearance。该属性(强制)更改(改变)默认(原生)样式…

JAVA用数据留给出师表排序,如果诸葛亮会编程,用Java写出师表...

继上一篇 "如果诸葛亮用C#写出师表..."后&#xff0c;站长想自己的第一语言是Java&#xff0c;虽然平时工作上用的不多&#xff0c;也用Java实现一遍吧&#xff0c;改改就是了&#xff0c;无非就是:C#的Console.WriteLine改为Java的System.out.println&#xff1b;C#…

linux下的安装命令行工具下载,linux系统程序安装(二)yum工具2-yum源及包下载

继续我们的yum工具应用之旅&#xff0c;yum工具之所以方便就是因为有方便的在线云库&#xff0c;实际工作中我们可能没办法链接互联网&#xff0c;或者我们想安装的程序原生源那么我们能不能用其他方式应用方便的yum源呢&#xff1f;一、使用光盘作为yum源1、将光盘挂载到/mnt目…

体积最小桌面linux,Tiny Core Linux - 体积最小的精简 Linux 操作系统发行版之一 (仅10多MB)...

Tiny Core Linux (TCL) 是一款极体积极小且高度可扩展的微型 Linux 发行版&#xff0c;它将一个 Linux 操作系统精简到仅有 10 多 MB 左右的大小&#xff0c;似乎小巧得有点让人叹为观止&#xff01;要知道无论是常见的 Ubuntu、CentOS、Debian 的体积动辄就是几百MB甚至要上GB…

linux新建samba账户,ubuntu上创建账户和samba用户

系统环境&#xff1a;Linux ubuntu152 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64x86_64 GNU/Linux系统用户登录创建linux账户:1. sudo adduser username --home /home/username执行该命令后需要两次输入账户密码&#xff0c;连续回车&…

在c语言中优先级最低的是6,C语言中 *,<<,= ,->哪个优先级最低

满意答案nishiwodezmx推荐于 2016.03.13采纳率&#xff1a;46% 等级&#xff1a;12已帮助&#xff1a;6812人最高的是->(指向运算符)再到*再到>>(右移运算符)再到(赋值运算符)c语言运算符号:1级优先级 左结合() 圆括号[] 下标运算符-> 指向结构体成员运算符. 结…

队列的顺序数组c语言代码,队列-队列的顺序表示和实现

队列-队列的顺序表示和实现和顺序栈相类似&#xff0c;在利用顺序分配存储结构实现队列时&#xff0c;除了用一维数组描述队列中数据元素的存储区域之外&#xff0c;尚需设立两个指针front和rear分别指示“队头”和“队尾”的位置。为了在C语言中描述方便&#xff0c;在此我们约…

android 链接分享到朋友圈,android 分享到微信朋友圈或微信好友

一、首先创建一个数字签名(keystore文件)这里不再讲述keystore的创建过程&#xff01;二、用keystore给app签名&#xff0c;注意最后如下图所示图中的md5就是 申请apkid时所需的 签名&#xff0c;这里需要注意MD5需要将其中的“&#xff1a;”去掉并将其中的大写字母改为小写三…

android studio开源代码,Android Studio Set of source 代码源集

一、源集1、定义&#xff1a;Android Studio 按逻辑关系将每个模块的源代码和资源进行分组&#xff0c;这个分组叫做源集。2、main Module 源集包括其所有构建变体共用的代码和资源。这句话很关键&#xff0c;意思是&#xff0c;所有的其他构建变体&#xff0c;src/main是其共同…

android nougat和安卓7.1,Android Nougat 7.1.2 先睹为快

Android Nougat 的下一个维护版本 7.1.2 即将发布&#xff01;为了让广大开发者有机会抢先尝鲜&#xff0c;我们从今天开始向已注册 Android Beta 计划、符合条件的设备(包括 Pixel 和 Pixel XL、Nexus 5X、Nexus Player 和 Pixel C 设备)推出公众测试版本。我们还在准备 Nexus…