网站首页 > 技术文章 正文
上一篇文章我们通过一种模式识别的方法(字符串转换成一个 32 位有符号整数-atoi 函数Leet ),把字符串转换为有符号整数。解决这个问题还有一种有趣的方法可以尝试,那就是确定有限状态机(Deterministic Finite Automation,DFA)。
复杂度分析:
时间复杂度:O(n),其中 n为字符串的长度。我们只需要依次处理所有的字符,处理每个字符需要的时间为 O(1)。
空间复杂度:O(1),自动机的状态只需要常数空间存储。
首先需要建立状态转移图:
我们就得出如下表格:
代码实现:
//宏定义所有状态
#define START 0
#define SIGNED 1
#define IN_NUMBER 2
#define END 3
#define MAX_STATE 4
//将表格转换为二维数组
int map[MAX_STATE][MAX_STATE] =
{
{START, SIGNED, IN_NUMBER, END},
{END, END, IN_NUMBER, END},
{END, END, IN_NUMBER, END},
{END, END, END, END}
};
状态之间的转移,通过输入的不同来驱动:
if(' ' == s[i])
{
state = map[state][START];
}
else if('+' == s[i] || '-' == s[i])
{
state = map[state][SIGNED];
}
else if(s[i] >= '0' && s[i] <= '9')
{
state = map[state][IN_NUMBER];
}
else
{
state = map[state][END];
}
在不同的状态,要实现不同的动作:
if(state == START)
{
continue;
}
if(state == SIGNED)
{
if ('-' == s[i])
{//如果存在-符号,flag取为-1
flag = -1;
}
}
if(state == IN_NUMBER)
{
if (ans < IntMax / 10 || (ans == IntMax / 10 && (s[i] - '0') < 8))
{
ans = ans * 10 + (s[i] - '0');
}
else
{
return (flag == 1? IntMax:IntMin);
}
}
if(state == END)
{
break;
}
从提交结果来看,该方法还可以:
1082 / 1082 个通过测试用例
状态:通过
执行用时: 4 ms
内存消耗: 5.6 MB
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INTMAX ((unsigned)(-1)>>1)
#define INTMIN (~INTMAX)
//宏定义所有状态
#define START 0
#define SIGNED 1
#define IN_NUMBER 2
#define END 3
#define MAX_STATE 4
int myAtoi(char * s)
{
int IntMax = INTMAX;
int IntMin = INTMIN;
int map[MAX_STATE][MAX_STATE] =
{//将表格转换为二维数组
{START, SIGNED, IN_NUMBER, END},
{END, END, IN_NUMBER, END},
{END, END, IN_NUMBER, END},
{END, END, END, END}
};
int state = 0;
int ans = 0;
int flag = 1;
for (int i = 0; i < strlen(s); i++)
{
//状态之间的转移,通过输入的不同来驱动:
if(' ' == s[i])
{
state = map[state][START];
}
else if('+' == s[i] || '-' == s[i])
{
state = map[state][SIGNED];
}
else if(s[i] >= '0' && s[i] <= '9')
{
state = map[state][IN_NUMBER];
}
else
{
state = map[state][END];
}
//在不同的状态,要实现不同的动作:
if(state == START)
{
continue;
}
if(state == SIGNED)
{
if ('-' == s[i])
{//如果存在-符号,flag取为-1
flag = -1;
}
}
if(state == IN_NUMBER)
{
if (ans < IntMax / 10 || (ans == IntMax / 10 && (s[i] - '0') < 8))
{
ans = ans * 10 + (s[i] - '0');
}
else
{
return (flag == 1? IntMax:IntMin);
}
}
if(state == END)
{
break;
}
}
return flag * ans;
}
int main()
{
char s[] = "-91";
int ans = myAtoi(s);
printf("%d\n", INTMAX);
printf("%d\n", ans);
return 0;
}
LeetCode系列:
二叉树系列:
- 上一篇: 互联网公司中:程序员大厂履历意味着什么?月薪35K?
- 下一篇: 数组双指针直接秒杀七道题目
猜你喜欢
- 2025-05-28 RxJs 介绍
- 2025-05-28 19个基本的JavaScript面试问题及答案(都是实用技巧)免费送
- 2025-05-28 数组双指针直接秒杀七道题目
- 2025-05-28 互联网公司中:程序员大厂履历意味着什么?月薪35K?
- 2025-05-28 六十六、Leetcode数组系列(中篇)
- 2025-05-28 征服LeetCode,你的刷题之路就此开始,手把手带你了解算法奥秘
- 2025-05-28 C语言干货:函数知识详解(变量的作用域,全局变量,静态变量)
- 2025-05-28 Python 从入门到精通:一个月就够了
- 2025-05-28 如果你真的想学Python可以试试我的方法
- 2025-05-28 30个常用的Python代码片段(下)
- 258℃Python短文,Python中的嵌套条件语句(六)
- 258℃python笔记:for循环嵌套。end=""的作用,图形打印
- 257℃PythonNet:实现Python与.Net代码相互调用!
- 252℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 107℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 83℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)