网站首页 > 技术教程 正文
上一篇文章我们通过一种模式识别的方法(字符串转换成一个 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系列:
二叉树系列:
- 上一篇: 六星教育:作为程序员的你,必须掌握的13个Java核心技术
- 下一篇: 线束三维装配校核方法(DFA)
猜你喜欢
- 2024-12-02 让每一次操作都得心应手
- 2024-12-02 美国狗粮评测网站DFA推荐狗粮排行榜(目前在售60个品牌)
- 2024-12-02 DFA新应用:优化工装夹具,缩短生产节拍,降低装配成本
- 2024-12-02 全新的标识和独一无二的象征
- 2024-12-02 2021 DFA亚洲最具影响力设计优异奖精选
- 2024-12-02 线束三维装配校核方法(DFA)
你 发表评论:
欢迎- 03-17'Great television' underscores changes underway
- 03-17CBN丨Chinese NEVs deepen local cooperation in SE. Asian market
- 03-17US-Philippines alignment in the South China Sea is a risky gamble
- 03-17Guest country of honor prepares for landmark year at CIIE
- 03-17怎么使用远程桌面传输文件?(怎么使用远程桌面传输文件夹)
- 03-175月27日起退休!微软旧版远程桌面告别,新App能否惊艳?
- 03-17微软宣布2025年下架“Microsoft 远程桌面”应用
- 03-17Win10 精简版 Tiny10 更新:加入远程桌面功能
- 最近发表
-
- 'Great television' underscores changes underway
- CBN丨Chinese NEVs deepen local cooperation in SE. Asian market
- US-Philippines alignment in the South China Sea is a risky gamble
- Guest country of honor prepares for landmark year at CIIE
- 怎么使用远程桌面传输文件?(怎么使用远程桌面传输文件夹)
- 5月27日起退休!微软旧版远程桌面告别,新App能否惊艳?
- 微软宣布2025年下架“Microsoft 远程桌面”应用
- Win10 精简版 Tiny10 更新:加入远程桌面功能
- P2Link通过内置远程桌面服务在网页端控制电脑
- 基于C++音视频高手课-WebRTC远程桌面后台服务实战-(完结)
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)