#include <string>
#include <vector>
#include <unordered_map>
using namespace std;class Solution {
public:bool isNumber(string s) {// 定义状态转移表vector<unordered_map<char, int>> states = {{{' ', 0}, {'s', 1}, {'d', 2}, {'.', 4}}, // 状态0:初始状态{{'d', 2}, {'.', 4}},                   // 状态1:符号位{{'d', 2}, {'.', 3}, {'e', 5}, {' ', 8}}, // 状态2:整数部分{{'d', 3}, {'e', 5}, {' ', 8}},         // 状态3:小数部分(有整数部分){{'d', 3}},                             // 状态4:小数部分(无整数部分){{'s', 6}, {'d', 7}},                   // 状态5:指数符号{{'d', 7}},                             // 状态6:指数符号后的符号位{{'d', 7}, {' ', 8}},                   // 状态7:指数部分{{' ', 8}}                              // 状态8:结尾空格};int currentState = 0;for (char c : s) {char type;if (isdigit(c)) type = 'd';else if (c == '+' || c == '-') type = 's';else if (c == 'e' || c == 'E') type = 'e';else if (c == '.') type = '.';else if (c == ' ') type = ' ';else return false; // 非法字符if (states[currentState].find(type) == states[currentState].end()) {return false; // 无法转移到下一个状态}currentState = states[currentState][type];}// 最终有效状态:2(整数)、3(小数)、7(指数)、8(结尾空格)return currentState == 2 || currentState == 3 || currentState == 7 || currentState == 8;}
};

代码解析:使用确定有限状态自动机验证有效数字

这段代码通过**确定有限状态自动机(DFA)**来验证一个字符串是否表示有效数字。下面我将从状态定义、转移规则到完整逻辑逐步解析:

一、整体思路

DFA 是一种计算模型,它包含:

  • 状态集合:不同处理阶段(如初始状态、符号位、整数部分等)
  • 转移规则:基于当前状态和输入字符决定下一个状态
  • 初始状态:验证开始的状态
  • 接受状态:验证成功的最终状态

这个解法将字符串处理过程划分为9个状态,通过转移表定义状态间的转换规则,最终根据结束状态判断是否有效。

二、状态定义与转移表

1. 状态定义

状态用整数表示(0-8),每个状态对应数字字符串的一个解析阶段:

  • 0:初始状态(可接受空格、符号、数字、小数点)
  • 1:符号位(+/-)
  • 2:整数部分(数字序列)
  • 3:小数部分(有整数的小数点后数字)
  • 4:小数部分(无整数的小数点后数字,如 .123
  • 5:指数符号(e/E)
  • 6:指数部分的符号位(如 123e+4 中的 +
  • 7:指数部分的整数
  • 8:结尾空格
2. 转移表结构
vector<unordered_map<char, int>> states = { ... };
  • 外层 vector 索引表示当前状态(0-8)
  • 内层 unordered_map 存储当前状态接受的字符类型及其对应的下一状态
  • 字符类型包括:
    • 'd':数字(0-9)
    • 's':符号(+/-)
    • 'e':指数符号(e/E)
    • '.':小数点
    • ' ':空格

三、状态转移规则详解

1. 初始状态(0)
{{' ', 0}, {'s', 1}, {'d', 2}, {'.', 4}}
  • 空格 → 保持初始状态(处理前导空格)
  • 符号 → 进入符号位状态(如 +123
  • 数字 → 进入整数部分(如 123
  • 小数点 → 进入无整数的小数部分(如 .123
2. 符号位状态(1)
{{'d', 2}, {'.', 4}}
  • 数字 → 进入整数部分(如 +123
  • 小数点 → 进入无整数的小数部分(如 -.123
3. 整数部分(2)
{{'d', 2}, {'.', 3}, {'e', 5}, {' ', 8}}
  • 数字 → 保持整数部分(如 123
  • 小数点 → 进入有整数的小数部分(如 123.45
  • 指数符号 → 进入指数符号状态(如 123e4
  • 空格 → 进入结尾空格状态(如 123
4. 小数部分(3)
{{'d', 3}, {'e', 5}, {' ', 8}}
  • 数字 → 保持小数部分(如 1.23
  • 指数符号 → 进入指数符号状态(如 1.23e4
  • 空格 → 进入结尾空格状态(如 1.23
5. 无整数的小数部分(4)
{{'d', 3}}
  • 数字 → 进入有整数的小数部分(如 .123 变为 0.123
6. 指数符号(5)
{{'s', 6}, {'d', 7}}
  • 符号 → 进入指数符号位(如 123e+4
  • 数字 → 进入指数整数部分(如 123e4
7. 指数符号位(6)
{{'d', 7}}
  • 数字 → 进入指数整数部分(如 123e+4
8. 指数整数部分(7)
{{'d', 7}, {' ', 8}}
  • 数字 → 保持指数部分(如 123e4
  • 空格 → 进入结尾空格状态(如 123e4
9. 结尾空格(8)
{{' ', 8}}
  • 空格 → 保持结尾空格状态(处理 trailing 空格)

四、字符类型映射

char type;
if (isdigit(c)) type = 'd';
else if (c == '+' || c == '-') type = 's';
else if (c == 'e' || c == 'E') type = 'e';
else if (c == '.') type = '.';
else if (c == ' ') type = ' ';
else return false; // 非法字符
  • 将输入字符映射为5种类型之一
  • 非法字符(如字母、其他符号)直接判定为无效

五、主验证逻辑

int currentState = 0;
for (char c : s) {// 字符类型映射...if (states[currentState].find(type) == states[currentState].end()) {return false; // 无法转移到下一个状态}currentState = states[currentState][type];
}// 最终有效状态:2(整数)、3(小数)、7(指数)、8(结尾空格)
return currentState == 2 || currentState == 3 || currentState == 7 || currentState == 8;
  • 流程
    1. 从初始状态(0)开始
    2. 遍历每个字符,映射为类型 type
    3. 检查当前状态是否接受该类型:
      • 若接受,转移到下一状态
      • 若不接受,返回 false
    4. 遍历结束后,检查最终状态是否为有效接受状态

六、接受状态说明

有效数字的最终状态必须是:

  • 2:整数部分(如 "123"
  • 3:小数部分(如 "1.23""123."".123"
  • 7:指数部分(如 "123e4""1.23e-4"
  • 8:结尾空格(如 " 123 ""123e4 "

七、示例验证

1. 合法数字
  • "123":0 → 2 → 2 → 2(最终状态2,有效)
  • "+1.23":0 → 1 → 2 → 3 → 3 → 3(最终状态3,有效)
  • " 123e-4 ":0 → 0 → 2 → 2 → 2 → 5 → 6 → 7 → 8 → 8(最终状态8,有效)
2. 非法数字
  • "123.":0 → 2 → 2 → 2 → 3(最终状态3,有效,但实际应为无效,此处代码存在漏洞)
  • "e123":0 → 5(无法继续转移,无效)
  • "123e":0 → 2 → 2 → 2 → 5(无法继续转移,无效)

八、代码优化建议

  1. 修复小数点问题:当前代码允许 "123." 为有效,需调整状态3的定义
  2. 使用更安全的类型:用枚举替代状态数字,提高可读性
  3. 预计算字符类型映射:避免每次循环都进行条件判断
  4. 添加测试用例:覆盖所有边界情况(如 "123e"".e123" 等)

九、总结

该代码通过DFA实现了有效数字的验证,将复杂的语法规则转化为清晰的状态转移表。虽然存在一些边界处理问题,但核心思路正确,适用于大多数常见场景。

leetcode 官方解答:

 class Solution {
public:enum State {STATE_INITIAL,STATE_INT_SIGN,STATE_INTEGER,STATE_POINT,STATE_POINT_WITHOUT_INT,STATE_FRACTION,STATE_EXP,STATE_EXP_SIGN,STATE_EXP_NUMBER,STATE_END};enum CharType {CHAR_NUMBER,CHAR_EXP,CHAR_POINT,CHAR_SIGN,CHAR_ILLEGAL};CharType toCharType(char ch) {if (ch >= '0' && ch <= '9') {return CHAR_NUMBER;} else if (ch == 'e' || ch == 'E') {return CHAR_EXP;} else if (ch == '.') {return CHAR_POINT;} else if (ch == '+' || ch == '-') {return CHAR_SIGN;} else {return CHAR_ILLEGAL;}}bool isNumber(string s) {unordered_map<State, unordered_map<CharType, State>> transfer{{STATE_INITIAL, {{CHAR_NUMBER, STATE_INTEGER},{CHAR_POINT, STATE_POINT_WITHOUT_INT},{CHAR_SIGN, STATE_INT_SIGN}}}, {STATE_INT_SIGN, {{CHAR_NUMBER, STATE_INTEGER},{CHAR_POINT, STATE_POINT_WITHOUT_INT}}}, {STATE_INTEGER, {{CHAR_NUMBER, STATE_INTEGER},{CHAR_EXP, STATE_EXP},{CHAR_POINT, STATE_POINT}}}, {STATE_POINT, {{CHAR_NUMBER, STATE_FRACTION},{CHAR_EXP, STATE_EXP}}}, {STATE_POINT_WITHOUT_INT, {{CHAR_NUMBER, STATE_FRACTION}}}, {STATE_FRACTION,{{CHAR_NUMBER, STATE_FRACTION},{CHAR_EXP, STATE_EXP}}}, {STATE_EXP,{{CHAR_NUMBER, STATE_EXP_NUMBER},{CHAR_SIGN, STATE_EXP_SIGN}}}, {STATE_EXP_SIGN, {{CHAR_NUMBER, STATE_EXP_NUMBER}}}, {STATE_EXP_NUMBER, {{CHAR_NUMBER, STATE_EXP_NUMBER}}}};int len = s.length();State st = STATE_INITIAL;for (int i = 0; i < len; i++) {CharType typ = toCharType(s[i]);if (transfer[st].find(typ) == transfer[st].end()) {return false;} else {st = transfer[st][typ];}}return st == STATE_INTEGER || st == STATE_POINT || st == STATE_FRACTION || st == STATE_EXP_NUMBER || st == STATE_END;}
};

代码解析:使用确定有限状态自动机验证有效数字

这段代码实现了LeetCode 65题「有效数字」的判断,采用了确定有限状态自动机(DFA)的思路。下面从整体到细节逐步解析:

一、整体解决方案概述

该解决方案通过以下步骤验证字符串是否为有效数字:

  1. 定义状态:将数字字符串的解析过程划分为不同阶段(状态)
  2. 定义字符类型:将输入字符分类为数字、指数符号等类型
  3. 构建状态转移表:定义每个状态在不同字符类型下的转移规则
  4. 状态转移遍历:从初始状态开始,按规则转移并判断最终状态

二、枚举类型定义

1. 状态枚举 (State)
enum State {STATE_INITIAL,        // 初始状态(允许前导空格,但代码中未处理空格)STATE_INT_SIGN,       // 整数符号位(+/-)STATE_INTEGER,        // 整数部分(数字序列)STATE_POINT,          // 小数点(左侧有整数)STATE_POINT_WITHOUT_INT, // 小数点(左侧无整数)STATE_FRACTION,       // 小数部分(小数点后的数字)STATE_EXP,            // 指数符号(e/E)STATE_EXP_SIGN,       // 指数符号后的符号位(+/-)STATE_EXP_NUMBER,     // 指数部分的整数STATE_END             // 结束状态(示例中未充分使用)
};
  • 每个状态代表当前解析到数字字符串的哪个阶段
  • 例如:STATE_POINT 表示已解析完整数部分,遇到小数点
2. 字符类型枚举 (CharType)
enum CharType {CHAR_NUMBER,  // 数字(0-9)CHAR_EXP,     // 指数符号(e/E)CHAR_POINT,   // 小数点(.)CHAR_SIGN,    // 符号位(+/-)CHAR_ILLEGAL  // 非法字符
};
  • 将输入字符分类,简化状态转移表的定义
  • 例如:所有数字字符(‘0’-‘9’)都归为 CHAR_NUMBER

三、字符类型转换函数

CharType toCharType(char ch) {if (ch >= '0' && ch <= '9') {return CHAR_NUMBER;} else if (ch == 'e' || ch == 'E') {return CHAR_EXP;} else if (ch == '.') {return CHAR_POINT;} else if (ch == '+' || ch == '-') {return CHAR_SIGN;} else {return CHAR_ILLEGAL;}
}
  • 功能:将输入字符映射到对应的 CharType 枚举值
  • 逻辑:判断字符是否为数字、指数符号、小数点、符号位或非法字符
  • 作用:使状态转移表只需关注字符类型,而非具体字符

四、状态转移表解析

unordered_map<State, unordered_map<CharType, State>> transfer{// 状态转移规则...
};

这是DFA的核心,定义了每个状态在不同字符类型下的转移目标。

1. 初始状态 (STATE_INITIAL)
{STATE_INITIAL, {{CHAR_NUMBER, STATE_INTEGER},      // 数字 → 整数部分{CHAR_POINT, STATE_POINT_WITHOUT_INT}, // 小数点 → 无整数的小数{CHAR_SIGN, STATE_INT_SIGN}        // 符号 → 符号位}
},
  • 初始状态可以接受数字、小数点或符号:
    • 数字:进入整数部分解析
    • 小数点:进入无整数的小数解析(如 .123
    • 符号:进入符号位解析(如 +123
2. 整数符号位 (STATE_INT_SIGN)
{STATE_INT_SIGN, {{CHAR_NUMBER, STATE_INTEGER},      // 数字 → 整数部分{CHAR_POINT, STATE_POINT_WITHOUT_INT} // 小数点 → 无整数的小数}
},
  • 符号位后只能接数字或小数点:
    • 例如:+123(符号→数字)、-.456(符号→小数点)
3. 整数部分 (STATE_INTEGER)
{STATE_INTEGER, {{CHAR_NUMBER, STATE_INTEGER},  // 数字 → 保持整数部分{CHAR_EXP, STATE_EXP},        // 指数符号 → 指数解析{CHAR_POINT, STATE_POINT}     // 小数点 → 有整数的小数}
},
  • 整数部分后可接:
    • 更多数字(保持整数部分)
    • 指数符号(如 123e4
    • 小数点(如 123.45
4. 有整数的小数点 (STATE_POINT)
{STATE_POINT, {{CHAR_NUMBER, STATE_FRACTION},  // 数字 → 小数部分{CHAR_EXP, STATE_EXP}           // 指数符号 → 指数解析}
},
  • 小数点后可接:
    • 数字(如 123.45
    • 指数符号(如 123.e4
5. 无整数的小数点 (STATE_POINT_WITHOUT_INT)
{STATE_POINT_WITHOUT_INT, {{CHAR_NUMBER, STATE_FRACTION}  // 数字 → 小数部分}
},
  • 无整数的小数点后必须接数字(如 .123
  • 若小数点后无数字(如 .),则转移失败
6. 小数部分 (STATE_FRACTION)
{STATE_FRACTION, {{CHAR_NUMBER, STATE_FRACTION},  // 数字 → 保持小数部分{CHAR_EXP, STATE_EXP}           // 指数符号 → 指数解析}
},
  • 小数部分后可接:
    • 更多数字(如 1.234
    • 指数符号(如 1.23e4
7. 指数符号 (STATE_EXP)
{STATE_EXP, {{CHAR_NUMBER, STATE_EXP_NUMBER},  // 数字 → 指数整数部分{CHAR_SIGN, STATE_EXP_SIGN}       // 符号 → 指数符号位}
},
  • 指数符号后可接:
    • 数字(如 123e4
    • 符号(如 123e+4123e-4
8. 指数符号位 (STATE_EXP_SIGN)
{STATE_EXP_SIGN, {{CHAR_NUMBER, STATE_EXP_NUMBER}  // 数字 → 指数整数部分}
},
  • 指数符号位后必须接数字(如 123e+4
  • 若符号后无数字(如 123e+),则转移失败
9. 指数整数部分 (STATE_EXP_NUMBER)
{STATE_EXP_NUMBER, {{CHAR_NUMBER, STATE_EXP_NUMBER}  // 数字 → 保持指数部分}
},
  • 指数整数部分后可接更多数字(如 123e12

五、主验证逻辑

bool isNumber(string s) {int len = s.length();State st = STATE_INITIAL;for (int i = 0; i < len; i++) {CharType typ = toCharType(s[i]);if (transfer[st].find(typ) == transfer[st].end()) {return false; // 转移失败,非有效数字} else {st = transfer[st][typ]; // 更新状态}}// 最终状态必须是有效接受状态return st == STATE_INTEGER || st == STATE_POINT || st == STATE_FRACTION || st == STATE_EXP_NUMBER || st == STATE_END;
}
  • 流程

    1. 从初始状态 STATE_INITIAL 开始
    2. 逐个字符处理,转换为类型 CharType
    3. 根据当前状态和字符类型查找转移表
    4. 若转移规则不存在,直接返回 false
    5. 处理完所有字符后,检查最终状态是否为接受状态
  • 接受状态

    • STATE_INTEGER:以整数结尾(如 123
    • STATE_POINT:以有整数的小数点结尾(如 123.
    • STATE_FRACTION:以小数结尾(如 1.23
    • STATE_EXP_NUMBER:以指数部分结尾(如 123e4
    • STATE_END:(示例中未充分使用,可用于结尾空格等场景)

六、代码注意事项

  1. 空格处理:当前代码未处理前导/ trailing 空格,实际有效数字可能包含空格(如 " 123 "
  2. 状态转移表效率:使用 unordered_map 实现转移表,查找效率为 O(1),但可优化为数组进一步提高性能
  3. 非法字符处理:遇到 CHAR_ILLEGAL 类型时直接判定为无效
  4. 边界情况覆盖
    • 整数:"123"
    • 小数:"1.23"".456"
    • 指数:"123e4""1.2e-3"
    • 符号:"+123""-4.5"

七、总结

该解决方案通过DFA清晰地建模了有效数字的解析过程,每个状态对应数字字符串的一个解析阶段,状态转移表定义了合法的字符接续规则。这种方法将复杂的规则判断转化为状态机的状态转移,逻辑清晰且易于维护,是解决字符串验证问题的经典思路。

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

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

相关文章

微服务(nacos+myibatis)中如何在一个模块调用多数据库源的一种方案

#nacos配置默认数据库 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.driverNamecom.mysql.jdbc.Driver #默认数据库名 master spring.datasource.dynamic.primarymaster spring.datasource.dynamic.strictfalse spring.datasource.d…

高标准通信国际接轨,Ethercat与PROFINET网关实现全自动化生产线

在呼和浩特&#xff0c;集成商以其先进的食品饮料行业解决方案&#xff0c;为乳制品行业打造了一个智能化工厂的典范。这个工厂的核心是PROFINET全集成自动化&#xff08;TIA&#xff09;&#xff0c;它通过SIMATIC S7-1200 PLC和ethercat系统&#xff0c;构建了一个强大的PROF…

Netty 引用计数抽象类 AbstractReferenceCountedByteBuf 详解

核心类图 ----------------------------- ---------------------------------- | ReferenceCountUpdater | | AbstractReferenceCountedByteBuf | | <T extends ReferenceCounted>| | (extends AbstractByteBuf) | ----------…

用Python做一个手机镜头

文章目录 设置光学参数添加光学器件 设置光学参数 官方文档&#xff1a;设计手机镜头 rayoptics中提供了OpticalModel类&#xff0c;可用于创建光学模型对象。OpticalModel类中的【optical_spec】成员&#xff0c;是一个OpticalSpecs对象&#xff0c;可用于指定光圈、视野、光…

16.1 Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战

Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战 #mermaid-svg-6Yor3ONhmPaQAcY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6Yor3ONhmPaQAcY6 .error-icon{fill:#552222;}#mermaid-svg-6Yor3ON…

基于SpringBoot + Vue打造的画师约稿平台实现

概述 基于SpringBoot Vue打造的画师约稿平台&#xff0c;该平台设计精美、功能完善&#xff0c;无论是想要搭建类似平台的开发者&#xff0c;还是对画师约稿系统感兴趣的人士&#xff0c;都能从中获取有价值的信息。 主要内容 ​​用户端功能​​&#xff1a; 如图所示&…

杰理-耳机-可视化sdk-最大音量提示音-7016G

杰理-耳机-可视化sdk-最大音量提示音 1.音量最大的时候发出消息 2.通过 MSG_FROM_AUDIO 进行发送 3.创建地方接收&#xff0c;并且播放提示音 学习q群:187115320

抖音图文带货权限怎么开通

在这个数字化营销蓬勃发展的时代&#xff0c;抖音作为一个流量巨大的平台&#xff0c;为广大创作者和商家提供了丰富的变现途径。其中&#xff0c;图文带货权限就是一个有效的拓宽变现能力的一个渠道。 那么&#xff0c;如何才能开通抖音的图文带货功能呢&#xff1f; 开通抖…

80、指标监控-Boot Admin Server

80、指标监控-Boot Admin Server Boot Admin Server是一个用于监控和管理Spring Boot应用程序的开源工具&#xff0c;以下是其相关介绍&#xff1a; #### 主要功能 - **应用状态监控** - 显示应用的在线状态、启动时间、运行时长等基本信息。 - 监控JVM指标&#xff0c;如内存…

Linux系统之Nginx反向代理与缓存

目录 一、正向代理和反向代理 1.1 正向代理概述 1.1.1 什么是正向代理 1.1.2 正向代理的作用 1.1.3 正向代理的基本格式 1.2 反向代理概述 1.2.1 什么是反向代理 1.2.2 反向代理可实现的功能 1.2.3 反向代理的可用模块 二、配置反向代理 2.1 反向代理配置参数 2.1.…

SpringBoot定时任务 - Timer实现方式

定时任务在实际开发中有着广泛的用途&#xff0c;本文主要帮助你构建定时任务的知识体系&#xff0c;同时展示Timer 的schedule和scheduleAtFixedRate例子&#xff1b;后续的文章中我们将逐一介绍其它常见的与SpringBoot的集成。 知识准备 需要对定时任务的使用场景和常见的实…

系统分析师学习笔记

系统分析师学习笔记 目录 系统分析师学习笔记前言1 数学与工程基础&#xff08;选择题2-4分&#xff09;1.1 图论与应用&#xff08;考选择题&#xff09;1.1.1 最小生成树1.1.2 最短路径1.1.3 网络与最大流量&#xff08;常考&#xff09; 1.2 预测与决策&#xff08;在原有基…

《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)

技术栈 Appgallery connect 开发准备 现在我们的app功能已经趋近完善&#xff0c;bug和缺失的细节也越来越少了&#xff0c;我们继续对app进行优化&#xff0c;首先是我们的积分页面&#xff0c;我们只实现了全部的积分展示内容&#xff0c;对收入和支出的积分明细并没有进行…

(七)Dockerfile文件20个命令大全详解

目录 1. FROM 基于基础镜像构建 1.1 FROM 指令开头 1.2 ARG和FROM使用 1.3 FROM可以多个 1.4 AS name 1.5 tag和digest 2. RUN 执行任何命令 2.1 shell和exec两种使用方式 2.2 [OPTIONS]参数 3. CMD 指定默认执行命令 3.1 使用格式shell和exec两种使用方式 3.2 只…

攻防世界-MISC-4-2

知识点 1.字频分析 步骤 下载附件是一段文本&#xff0c; 在线网站处理&#xff1a;quipqiup - cryptoquip and cryptogram solver flag{classical-cipher_is_not_security_hs}

Nordic nRF54L15 SoC对包含电池监测、中断处理和电源轨控制的定制 nPM1300 示例

1&#xff1a;以下是适用于 nRF Connect SDK (NCS) 的基于 Zephyr 的示例应用程序&#xff0c;展示了&#xff1a; 读取电池电压和状态处理来自 nPM1300 的中断&#xff08;例如&#xff0c;电池或电源轨事件&#xff09;控制电源轨&#xff08;通过 GPIO 启用/禁用&#xff0…

MySQL 单机部署

文章目录 1、准备阶段1.1、部署规划1.2、硬件准备1.3、软件准备1.4、环境清理 2、实施阶段2.1、操作系统实施2.2、数据库部署实施 3、完成 1、准备阶段 1.1、部署规划 本次部署用于测试环境&#xff0c;单机模式&#xff0c;不需要主备&#xff1b;MySQL数据库版本要MySQL5.7…

小程序学习笔记:实现上拉触底加载随机颜色案例全解析

在前端开发中&#xff0c;上拉触底加载数据是一个常见的交互需求。今天&#xff0c;我们就来详细探讨如何实现一个上拉触底加载随机颜色的案例&#xff0c;帮助大家更好地理解相关技术的应用。 案例效果展示 在这个案例里&#xff0c;我们最终要实现的效果是这样的&#xff1…

Java+GcExcel,生成自定义工作表

引言 在当今数字化办公和数据处理的时代&#xff0c;电子表格的应用无处不在。对于 Java 开发人员来说&#xff0c;如何高效地创建、操作和处理兼容 Microsoft Excel 的电子表格是一个常见的需求。GcExcel Java 作为葡萄城表格解决方案中的后端表格组件&#xff0c;为 Java 开…

跨平台C++软件开发之基本数据类型介绍

跨平台C软件开发过程中&#xff0c;原生数据类型的字节宽度差异是一个常见且关键的问题&#xff0c;不同操作系统、编译器、硬件架构可能会为相同的数据类型分配不同的字节数&#xff0c;这可能导致代码在移植过程中出现未定义的行为或兼容性问题。本文简要介绍C原生数据类型字…