当前位置: 首页 > news >正文

【Java算法】模拟

 🔥个人主页: 中草药 

 🔥专栏:【算法工作坊】算法实战揭秘


🧣 一.模拟算法

        模拟算法和传统的算法有一些不同之处,更多的是对题目要求的理解,通过代码的方式去模拟实现一道题目在现实中的实现方法,比较直观通俗易懂,比较直线的去推导某个流程,完整的实现了求解的过程,我个人认为这就是部分题暴力算法

        模拟算法是一种通过逐步模拟现实世界中的过程或系统行为来解决问题的方法。这种算法通常用于那些可以通过一系列明确步骤来描述其行为的场景。模拟算法可以应用于各种领域,包括物理模拟、经济建模、交通流量分析、游戏开发等。

基本步骤

  1. 定义问题

    • 明确你要模拟的系统或过程是什么。
    • 确定模拟的目标,即通过模拟你想获得什么结果。
  2. 建立模型

    • 设计一个抽象模型来表示系统的行为。
    • 定义系统的状态和影响状态变化的各种因素。
    • 确定状态变化的规则和条件。
  3. 初始化状态

    • 设置模拟的初始状态。
    • 确定初始条件和参数。
  4. 执行步骤

    • 通过一系列预定的步骤来逐步推进模拟过程。
    • 每一步根据模型中定义的规则更新系统状态。
  5. 终止条件

    • 设定模拟结束的条件。
    • 当达到终止条件时停止模拟。
  6. 分析结果

    • 收集模拟过程中产生的数据。
    • 分析数据以获取有用的信息或结论。

案例

交通流量模拟

假设我们要模拟一条街道上的车流量,并评估不同交通信号灯配置的效果。

  1. 定义问题

    • 目标是找到最优的信号灯配置,以减少交通拥堵。
  2. 建立模型

    • 模型包括街道长度、车辆进入频率、信号灯位置和切换周期等参数。
    • 规则包括车辆前进、停止、转弯等行为。
  3. 初始化状态

    • 设置初始时间、车辆数量和位置。
    • 设置信号灯的初始状态(红或绿)。
  4. 执行步骤

    • 每个时间步长更新车辆的位置。
    • 根据信号灯状态决定车辆是否停止。
    • 模拟车辆到达和离开路口。
  5. 终止条件

    • 当所有车辆都通过了模拟区域后停止模拟。
  6. 分析结果

    • 计算总的等待时间和平均速度。
    • 分析不同信号灯配置下的效果差异。

优点和缺点

优点

  • 灵活性:可以模拟复杂系统的行为。
  • 可控制性:可以通过调整参数来研究不同条件下的结果。
  • 可视化:模拟结果可以直观展示,便于理解和沟通。

缺点

  • 性能瓶颈:大规模模拟可能需要较长的运行时间和较大的计算资源。
  • 精确度依赖于模型:模型的准确性直接影响模拟结果的可靠性。
  • 难以捕捉所有细节:实际系统可能比模拟模型更为复杂,某些因素可能无法完全建模。

👗二. 1576.替换所有问号

题目链接:1576.替换所有问号

代码

 public String modifyString(String s) {char[] ch=s.toCharArray();for(int i=0;i<ch.length;i++){if(ch[i]=='?'){for(char tmp='a';tmp<='z';tmp++){//注意这个if条件 十分巧妙 做了边界情况的处理if((i==0||tmp!=ch[i-1])&&(i==ch.length-1||tmp!=ch[i+1])){ch[i]=tmp;break;//有一个符合条件的结果即可break跳出循环}}}}return new String(ch);}

算法原理 

这道题,模拟起来非常简单,for循环遍历24个字母,来反复推导,其中 if 语句的设置十分巧妙,做了边界处理,优化了模拟算法的全过程

遍历字符数组: 

for (int i = 0; i < ch.length; i++) {if (ch[i] == '?') {// 处理 '?' 字符}
}
  • 遍历字符数组 ch,找到所有的 '?' 字符,并进行替换。

替换 '?' 字符

for (char tmp = 'a'; tmp <= 'z'; tmp++) {if ((i == 0 || tmp != ch[i - 1]) && (i == ch.length - 1 || tmp != ch[i + 1])) {ch[i] = tmp;break;}
}
  • 对于每个 '?' 字符,尝试用 'a' 到 'z' 的所有小写字母进行替换。
  • 使用一个内层循环,从 'a' 开始逐个尝试替换。
  • 替换的条件是:
    • 当前位置 i 为字符串的第一个字符,或者 tmp 不等于前一个字符 ch[i - 1]
    • 当前位置 i 为字符串的最后一个字符,或者 tmp 不等于后一个字符 ch[i + 1]
  • 如果找到了一个符合条件的字符 tmp,就将 ch[i] 替换为 tmp 并退出内层循环。
  • 将修改后的字符数组 ch 转换回字符串并返回。

为什么能保证替换后的字符不与相邻字符相同?

  • 边界条件处理

    • 当 i 为0时,即当前位置为字符串的第一个字符,只需检查 tmp 是否与后一个字符 ch[i + 1] 相同。
    • 当 i 为 ch.length - 1 时,即当前位置为字符串的最后一个字符,只需检查 tmp 是否与前一个字符 ch[i - 1] 相同。
    • 对于其他位置,需要同时检查前后字符。
  • 逐个尝试替换

    • 从 'a' 开始逐个尝试替换,如果某个字符 tmp 满足条件,则立即替换并退出内层循环。
    • 这样可以保证找到的第一个符合条件的字符 tmp 被使用,从而避免了不必要的替换。

🎒三. 495.提莫攻击

题目链接:495.提莫攻击

代码

public int findPoisonedDuration(int[] timeSeries, int duration) {int ret=0;for(int i=0;i<timeSeries.length-1;i++){int tmp=0;//算出每两个数的差值tmp=timeSeries[i+1]-timeSeries[i];if(tmp<=duration){ret+=tmp;}else{ret+=duration;}}return ret+=duration;}

算法原理

        为了方便理解此处运用到的模拟算法,可以将上述代码进行拓展,申请额外的空间来理解此问题

public int findPoisonedDuration1(int[] timeSeries, int duration) {int[] tmp=new int[timeSeries.length-1];for(int i=0;i<timeSeries.length-1;i++){//算出每两个数的差值tmp[i]=timeSeries[i+1]-timeSeries[i];}int ret=0;//判断差值for(int i=0;i<tmp.length;i++){if(tmp[i]<=duration){ret+=tmp[i];}else{ret+=duration;}}//最后加上最后一次中毒时间return ret+=duration;}

由于中毒时间 duration 是固定的,只要间隔时间小于等于它,只需在总时长加上,两次攻击间隔的时间,如果两次间隔时间大于它,只加上一次duration就行

遍历时间序列

for (int i = 0; i < timeSeries.length - 1; i++) {...
}
  • 遍历时间序列 timeSeries 中的每个元素(除了最后一个元素)。

计算相邻攻击时间差

int tmp = 0;
tmp = timeSeries[i + 1] - timeSeries[i];
  • 计算相邻两次攻击之间的时间差 tmp

判断攻击持续时间

if (tmp <= duration) {ret += tmp;
} else {ret += duration;
}
  • 如果相邻两次攻击之间的时间差 tmp 小于等于 duration,则说明第二次攻击发生在第一次攻击的持续时间内,因此攻击的总持续时间为两次攻击之间的时间差 tmp
  • 如果相邻两次攻击之间的时间差 tmp 大于 duration,则说明第二次攻击发生在第一次攻击结束后,因此攻击的总持续时间为 duration

处理最后一次攻击

return ret += duration;
  • 最后一次攻击没有后续攻击,因此需要加上最后一次攻击的持续时间 duration

为什么能计算出攻击的总持续时间?

  • 攻击持续时间叠加:如果两次攻击之间的时间差小于等于 duration,则第二次攻击是在第一次攻击的持续时间内发生的,因此两次攻击的总持续时间为两次攻击之间的时间差。
  • 独立攻击持续时间:如果两次攻击之间的时间差大于 duration,则两次攻击相互独立,每次攻击的持续时间为 duration

👑四. 6.Z字形变换

题目链接:6.Z字形变换

代码

public String convert(String s, int numRows) {//处理边界情况if(numRows==1){return s;}int diff=2*numRows-2;StringBuilder stb=new StringBuilder();//处理第一行for(int i=0;i<s.length();i+=diff){stb.append(s.charAt(i));}//处理中间行for(int i=1;i<numRows-1;i++){//注意理解这里的for循环,以及内置条件for(int j=i,k=diff-i;j<s.length()||k<s.length();j+=diff,k+=diff){if(j<s.length()){stb.append(s.charAt(j));}if(k<s.length()){stb.append(s.charAt(k));}}}//处理最后一行for(int i=numRows-1;i<s.length();i+=diff){stb.append(s.charAt(i));}return stb.toString();}

算法原理

这道题的模拟相对比较复杂,需要将这个字符串拆解为三部分,第一行,中间行,最后一行三部分,然后总结每一行的规律,模拟这个填放的过程,并且算出间隔值diff用于辅助处理各个目标  额外,要处理边界情况

处理边界情况

if (numRows == 1) {return s;
}
  • 如果 numRows 为1,则不需要进行任何变换,直接返回原字符串 s

初始化变量

int diff = 2 * numRows - 2;
StringBuilder stb = new StringBuilder();
  • 计算每行字符之间的间隔距离 diff,即每行字符的下标之差。
  • 初始化一个 StringBuilder 对象 stb 用于构建新的字符串。

处理第一行

for (int i = 0; i < s.length(); i += diff) {stb.append(s.charAt(i));
}
  • 遍历字符串 s,每隔 diff 个字符取一个字符,这些字符属于第一行。

处理中间行

for (int i = 1; i < numRows - 1; i++) {for (int j = i, k = diff - i; j < s.length() || k < s.length(); j += diff, k += diff) {if (j < s.length()) {stb.append(s.charAt(j));}if (k < s.length()) {stb.append(s.charAt(k));}}
}
  • 对于中间的每一行,需要取两个位置的字符:一个在斜线上,另一个在斜线下方。
  • 内层循环中,j 表示斜线上的字符位置,k 表示斜线下方的字符位置。
  • 取 j 和 k 位置的字符,直到它们超出字符串长度。

处理最后一行

for (int i = numRows - 1; i < s.length(); i += diff) {stb.append(s.charAt(i));
}
  • 遍历字符串 s,每隔 diff 个字符取一个字符,这些字符属于最后一行。

为什么能实现“Z”字形排列?

  • 每行字符的间隔:每行字符之间的间隔为 diff,即 2 * numRows - 2
  • 第一行和最后一行:第一行和最后一行的字符每隔 diff 个字符取一个。
  • 中间行:中间行的字符需要在斜线和斜线下方两个位置取字符,这两个位置的间隔分别为 i 和 diff - i

🧥五. 38.外观数列

题目链接:38.外观数列

代码

 public String countAndSay(int n) {String ret = "1";for (int i = 0; i < n - 1; i++) {int len = ret.length();StringBuilder stb = new StringBuilder();for (int left = 0, right = 0; right < len; ) {//为防止元素越界,注意while里面的条件while (right < len && ret.charAt(right) == ret.charAt(left)) {right++;}stb.append(right - left);stb.append(ret.charAt(left));left = right;}ret = stb.toString();}return ret;}

算法原理 

个人认为 这道题可以类比斐波那契函数的那道题,都是模拟出这个外观函数的推导过程,算出第n个是什么,只需模拟出题目要求即可

初始化结果变量

String ret = "1";
  • 初始化结果字符串 ret 为 "1",这是序列的第一项。

循环生成序列

for (int i = 0; i < n - 1; i++) {...
}
  • 循环 n - 1 次,因为序列的第一项已经初始化为 "1"

生成下一项

int len = ret.length();
StringBuilder stb = new StringBuilder();
for (int left = 0, right = 0; right < len;) {while (right < len && ret.charAt(right) == ret.charAt(left)) {right++;}stb.append(right - left);stb.append(ret.charAt(left));left = right;
}
ret = stb.toString();
  • 遍历当前字符串 ret,使用双指针 left 和 right 来确定连续相同字符的数量。
  • 当 right 指针遇到不同的字符时,计算 right - left,这表示从 left 到 right 之间的相同字符的数量。
  • 将字符数量和字符本身追加到 StringBuilder 对象 stb 中。
  • 更新 left 指针为 right 指针,继续寻找下一个不同的字符。
  • 将 StringBuilder 对象转换为字符串,并将其赋值给 ret,作为生成的下一项。

🎓六. 1419.数青蛙

题目链接:1419.数青蛙

代码

 public int minNumberOfFrogs(String croakOfFrogs) {String t="croak";int n=t.length();char[] croakOfFrog=croakOfFrogs.toCharArray();//这个哈希表用于作为解决问题int[] hash=new int[n];//这是一个哈希映射表,用来映射每个字符的下标HashMap<Character,Integer> map=new HashMap<>();//将映射表补充完整for(int i=0;i<n;i++){map.put(t.charAt(i),i);}for(char ch:croakOfFrog){//用一个if解决问题if(ch==t.charAt(0)){//若有青蛙完成呱呱,则可以进行下一次,由他去负责下一次呱呱if(hash[n-1]!=0){hash[n-1]--;}hash[0]++;}else{int i=map.get(ch);if(hash[i-1]==0){return -1;}hash[i-1]--;hash[i]++;}}//不符合要求for(int i=0;i<n-1;i++){if(hash[i]!=0){return -1;}}return hash[n-1];}

算法原理

这道题要理解清楚模拟的过程,需要两个哈希表,一个哈希表作为哈希映射表,用于记录 叫声 croak 每个字符对应的下标,另一个哈希表帮助我们来实现问题,具体模拟是,遍历字符串的每个字符 第一个字符进行特殊处理 首先判断最后一个字符 k 对应的value是否有值,有值代表,已经有青蛙完成了一次croak,可以进行下一次croak因此相当于从k处拿一只青蛙,去进行故 hash[n-1]-- hash[0]++ ,在遍历其他值是 如果它所对应的数的上一个的value值为0,则直接返回-1,因为不符合题目要求 若符合要求 hash[i-1]--;hash[i]++;在进行此工作之后,在最后遍历一次哈希表,如果除最后一个位置其他值的value值不为0,则代表有冗余,直接返回-1

初始化变量

String t = "croak";
int n = t.length();
char[] croakOfFrog = croakOfFrogs.toCharArray();
int[] hash = new int[n];
HashMap<Character, Integer> map = new HashMap<>();
  • 初始化字符串 t 为 "croak"
  • 将输入字符串 croakOfFrogs 转换成字符数组 croakOfFrog
  • 初始化一个长度为5的整数数组 hash,用于记录 "croak" 每个字符的状态。
  • 初始化一个 HashMap map,用于存储 "croak" 中每个字符对应的索引。

填充哈希映射表

for (int i = 0; i < n; i++) {map.put(t.charAt(i), i);
}
  • 将每个字符及其对应的索引存入 map 中。例如,'c' 对应索引0,'r' 对应索引1,等等。

遍历字符数组

for (char ch : croakOfFrog) {if (ch == t.charAt(0)) {if (hash[n - 1] != 0) {hash[n - 1]--;}hash[0]++;} else {int i = map.get(ch);if (hash[i - 1] == 0) {return -1;}hash[i - 1]--;hash[i]++;}
}
  • 遍历输入字符数组 croakOfFrog
  • 如果当前字符 ch 是 'c'(即 "croak" 的第一个字符),则:
    • 如果有青蛙已经完成了 "croak",则将 hash[n - 1] 减1(表示一只青蛙完成了一次 "croak")。
    • 将 hash[0] 加1(表示一只新青蛙开始发出 "croak")。
  • 如果当前字符 ch 不是 'c',则:
    • 获取该字符对应的索引 i
    • 如果 hash[i - 1] 为0,则返回 -1(表示不可能完成 "croak" 序列)。
    • 将 hash[i - 1] 减1,并将 hash[i] 加1(表示当前字符 ch 已经发出)。

检查最终状态

for (int i = 0; i < n - 1; i++) {if (hash[i] != 0) {return -1;}
}
return hash[n - 1];
  • 检查 hash 数组的前四个位置是否全部为0。如果不是,则返回 -1(表示不可能完成 "croak" 序列)。
  • 返回 hash[n - 1],即完成 "croak" 的青蛙数量。

为什么能计算出最少需要多少只青蛙?

  • 状态记录:通过 hash 数组记录每个字符的状态,每个位置对应 "croak" 中的一个字符。
  • 哈希映射:通过 map 快速查找每个字符对应的索引。
  • 逻辑判断:通过判断当前字符是否为 'c' 或者是否符合 "croak" 序列的要求来更新状态。
  • 最终状态检查:通过检查 hash 数组的最终状态来验证是否所有 "croak" 序列都被正确完成。

相关文章:

【Java算法】模拟

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f9e3; 一.模拟算法 模拟算法和传统的算法有一些不同之处&#xff0c;更多的是对题目要求的理解&#xff0c;通过代码的方式去模拟实现一道题目在现实中的实现方法…...

标准库标头 <filesystem> (C++17)学习之文件类型

本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…...

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...

mysql笔记4(数据类型)

数据库的数据类型应该是数据库架构师(DBA)和产品经理沟通后依据公司的项目、业务而定的&#xff0c;而且会不停地变化。数据类型的选择方面没有一个统一的标准&#xff0c;但是应该符合业务、项目的逻辑标准。 菜鸟教程 Mysql 数据类型 文章目录 1. int类型2. 浮点数3. 定点数4…...

电脑开机出现no operation system found错误原因分析及解决方法

最近有网友问我电脑一启动提示&#xff1a;no operation system found&#xff0c;这个提示意思是未找到操作系统。并且出现bios能认别硬盘&#xff0c;快捷启动时找不到硬盘&#xff0c;出现该提示的原因有很多&#xff0c;下面我们来详细分析一下开机出现no operation system…...

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…...

@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor

quill官方中文文档&#xff1a;https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意&#xff1a;想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装&#xff1a; npm install quilllatest 版本需要大于2.0版本 npm…...

gpp.bat,g++编译C++源文件的批处理

今天编写一个gpp.bat文件&#xff0c;是专门编译C源文件的批处理&#xff0c;内容如下&#xff1a; g %1.cpp -o %1.exegpp.bat的文件路径&#xff1a;D:\YcjWork\CppTour\gpp.bat 使用方法&#xff0c;在CMD下运行(//两个斜杠后面的内容是注释)&#xff1a; //运行gpp.bat&…...

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…...

【赵渝强老师】大数据主从架构的单点故障

大数据体系架构中的核心组件都是主从架构&#xff0c;即&#xff1a;存在一个主节点和多个从节点&#xff0c;从而组成一个分布式环境。下图为展示了大数据体系中主从架构的相关组件。   视频讲解如下&#xff1a; 大数据主从架构的单点故障 【赵渝强老师】大数据主从架构的…...

【AutoX.js】选择器 UiSelector

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文&#xff1a;https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…...

Elasticsearch数据写入过程

1. 写入请求 当一个写入请求&#xff08;如 Index、Update 或 Delete 请求&#xff09;通过REST API发送到Elasticsearch时&#xff0c;通常包含一个文档的内容&#xff0c;以及该文档的索引和ID。 2. 请求路由 协调节点&#xff1a;首先&#xff0c;请求会到达一个协调节点…...

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…...

在C++中,如何避免出现Bug?

C中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知&#xff0c;最佳做法是在编译阶段尽早检测错误。让我们来看看现代C中的一些技术&#xff0c;这些技术不仅帮助编写简单明了的代码&…...

Linux 操作系统 进程(1)

什么是进程 想要了解什么是进程&#xff0c;或者说&#xff0c;为什么会有进程这个概念&#xff0c;我们就需要去了解现代计算机的设计框架(冯诺依曼体系)&#xff1a; 计算机从设计之初就以执行程序为核心任务&#xff0c;也就是运算器从内存中读取&#xff0c;也只从内存中…...

clickhouse-v24.1-离线部署

部署版本 数据库版本&#xff1a;24.1.1.2048 jdk版本&#xff1a;jdk8 4个文件&#xff08;三个ck的包&#xff09;&#xff1a; OpenJDK8U-jdk_x64_linux_hotspot_8u382b05.tar clickhouse-client-24.1.1.2048.x86_64.rpm clickhouse-common-static-24.1.1.2048.x86_64.…...

安卓13删除app 链接库警告弹窗Detected problems with app native

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码修改彩蛋1.前言 有些客户的APP,打开首次会弹窗提示窗口, Detected problems with app native libraries (please consult log for detail):,需要删除这个窗口,避免挡住用户APP。而且这个提示有些app是以t…...

第四次北漂----挣个独立游戏的素材钱

第四次北漂&#xff0c;在智联招聘上&#xff0c;有个小公司主动和我联系。面试了下&#xff0c;决定入职了&#xff0c;osg/osgearth的。月薪两万一。 大跌眼镜的是&#xff0c;我入职后&#xff0c;第一天的工作内容就是接手他的工作&#xff0c;三天后他就离职了。 我之所以…...

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟&#xff1a;老大&#xff0c;我最近在做一个项目&#xff0c;遇到了点麻烦。我们有很多相似的操作流程&#xff0c;但每个流程的细节又有些不同。我写了很多重复的代码&#xff0c;感觉很乱。你有啥好办法吗&#xff1f; 老鸟&#xff1a;嗯&#xff0c;听起…...

CSS学习10[重点]--浮动、浮动的效果以及内幕特性

CSS布局——浮动 前言一、普通流二、浮动三、什么是浮动?四、浮动的内幕特性总结 前言 CSS盒子布具的三种机制&#xff1a;普通流&#xff08;标准流&#xff09;、定位、浮动。 一、普通流 普通流&#xff1a;网页内元素自上而下&#xff0c;从左到右排序。 二、浮动 浮动…...

matlab基本语法

基本语法 变量命名规则 区分大小写长度不超过63位字母开头&#xff0c;可以有字母、下划线和数字组成&#xff0c;但不能使用标点应该简洁明了 命令行窗口 >>>clc 清楚命令窗口 >>> claer all 清理工作区内容 注释 %% 注释符 数据类型 1.数字 11 2…...

【Leetcode152】乘积最大子数组(动态规划)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 &#xff08;0&#xff09;读懂题意&#xff1a;题目的“连续”是指位置的连续&#xff0c;而不是说数字的连续&#xff0c;这是个大坑。 &#xff08;1&#xff09;确定状态&#xff1a;定义两个状态来记录当前子数组的…...

STM32(十二):DMA直接存储器存取

DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源。&#xff08;运行内存SRAM、程序存储器Flash、寄存器&#xff09; 12个独立可配置的通道&…...

关于我2020年7月至今(2024.9)的“炒股”经历和感受

声明&#xff1a;我远不是一个成熟的投资者(这个名词太大了&#xff0c;我那三瓜两枣似乎完全配不上投资者这三个字&#xff0c;或者“小小散”更加贴切)。本文不构成任何入(股)市的引导或者买卖股票的建议。 “炒股”这个词&#xff0c;相信绝大多数人看来都-是一个贬义词&…...

【Tools】Prompt Engineering简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样 &#x1f3b5; 方芳《摇太阳》 大模型中的Prompt Engineering是指为了提高大模型在特定任…...

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds 总结 fd_set操作接口 timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充 获取新连接 注意点 -- 通信时的调用函数 添…...

乐鑫安全制造全流程

主要参考资料&#xff1a; 【乐鑫全球开发者大会】DevCon24 #10 &#xff5c;乐鑫安全制造全流程 乐鑫官方文档Flash加密: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/security/flash-encryption.html 【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能…...

〖open-mmlab: MMDetection〗解析文件:configs/_base_/schedules

详细解析三个训练调度文件&#xff1a;schedule_1x.py、schedule_2x.py、schedule_20e.py 在深度学习模型训练过程中&#xff0c;训练调度&#xff08;Training Schedule&#xff09;是至关重要的&#xff0c;它决定了模型训练过程中学习率&#xff08;Learning Rate, LR&…...

Android之Handler是如何保证延迟发送的

目录 核心组件延迟发送消息的工作原理具体步骤1. 创建 Handler:2.发送延迟消息3.消息入队列4.消息出队和处理: 关键点总结 在 Android 中&#xff0c;Handler 是用于在不同线程之间传递和处理消息的工具。它可以用于定时任务、延迟执行任务等。Handler 如何保证延迟发送消息的核…...

定位信标、基站、标签,定位信标是什么

定位信标、基站、标签&#xff0c;定位信标是什么 今天给各位分享定位信标、基站、标签的知识&#xff0c;其中也会对定位信标是什么进行解释&#xff0c;如果能碰巧解决你现在面临的问题&#xff0c;别忘了关注本站&#xff0c;现在开始吧&#xff01; 怎样做人员定位啊? 〖…...