博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leet-go]-判断字符串是否为数字
阅读量:2055 次
发布时间:2019-04-28

本文共 1290 字,大约阅读时间需要 4 分钟。

文章目录

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

题解分析

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

  • 空格;
  • 数组:0~9;
  • 正负号
  • 小数点
  • 幂符号:e/E;

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

  • 0:开始的空格;
  • 1:幂符号前的正负号;
  • 2:小数点前的数字;
  • 3:小数点、小数点后的数字;
  • 4:小数点前为空格时:小数点、小数点后的数字;
  • 5:幂符号;
  • 6:幂符号后的正负号;
  • 7:幂符号后的数字;
  • 8:结尾的空格;

合法的结束状态有:2、3、7、8。

状态转移如下图所示:

State

复杂度分析:

  • 时间:需要遍历整个字符串的长度,且状态转移为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://ewilf.baihongyu.com/

你可能感兴趣的文章
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
CentOS 8 都发布了,你还不会用 nftables?
查看>>
一点也不流氓的搜狗输入法皮肤
查看>>
Grafana 6.4 正式发布!
查看>>
etcd 性能测试与调优
查看>>
Docker 大势已去,Podman 万岁
查看>>
Podman 使用指南
查看>>
国内 2018 年 12 月 XX 站访问百强榜单
查看>>
Linux Capabilities 入门教程:概念篇
查看>>
Linux Capabilities 入门:让普通进程获得 root 的洪荒之力
查看>>
为什么我会了SOA,你们还要逼我学微服务?
查看>>
Linux Capabilities 入门:如何管理文件的 capabilities?
查看>>
Linux Capabilities 入门教程:基础实战篇
查看>>
如何向纯洁的女朋友解释并发与并行的区别?
查看>>
一名云原生搬砖师的自白
查看>>
红帽宣布发布企业容器仓库开源项目 Quay
查看>>
跨平台构建 Docker 镜像新姿势,x86、arm 一把梭
查看>>