PHP刷华为机试全攻略:高频算法模板与在线训练实战指南
说实话用 PHP 去刷大厂机试很多人的第一反应是“不太行”。但我自己用 PHP 刷完几百道在线训练题之后反而觉得这套语言在机试场景下非常顺手字符串处理是看家本领关联数组天然就是哈希表写出来的代码往往比 Java、C 短一大截。这篇文章不是带你背题而是想把“PHP 华为机试 在线训练”这条路的关键解题思路串起来从出题逻辑、高频考点模板到完整题目拆解和实战卡点排查一次性讲透。适合正在准备机试、主语言是 PHP或者觉得“用 PHP 刷算法题没方向”的朋友参考。1. 先看懂这场机试出题逻辑和 PHP 的适配问题1.1 这类在线训练到底在考什么先说一个很多人会误解的地方华为机试不是 ACM 竞赛也不考高深的数据结构理论。它的核心目标是在有限时间内判断你能不能把一个模糊需求拆成清晰的执行步骤并用代码稳定实现。所以真题里占大头的往往不是“红黑树”“网络流”这类竞赛内容而是工程里最常见的字符串清洗、数组遍历、条件模拟、栈和哈希表应用。你只要把高频题型练熟通过率会明显高于漫无目的地刷难题。从我在在线训练平台看到的题目分布来看大致可以分成这几类字符串处理约占三成数组与哈希约占两成模拟与逻辑题约占一成半栈与队列约占一成排序与二分约一成半剩下是动态规划、图论等进阶题。这个比例非常重要因为它直接决定了复习重心。如果时间有限按占比从高到低练性价比最高。在线训练和本地 IDE 写代码的感觉差别也很大。机试环境通常没有自动补全没有代码提示甚至不能装插件很多平时依赖编辑器的地方都要靠裸手写。这就是为什么必须提前在在线训练页面上多敲代码不是“会用 PHP”就行而是要“在不依赖工具的情况下也能顺畅写出 PHP”。另外一个区别是输入输出方式机试一般是从标准输入读数据然后逐行打印结果跟写网页接口完全是两回事。1.2 PHP 机试容易踩的三个坑与应对认知PHP 在机试里最大的坑不是语法而是“惯性思维”。平时写业务代码习惯了$_POST、json_encode、foreach套模板到了机试环境就容易在输入输出上翻车。我最初刷题时几次提交都挂在同一类问题上忘了用trim()清理行尾换行、用了array_shift()处理大数组导致超时、strpos()返回 0 时被当成 false 判断。这些小问题单独看不复杂但在限时环境里叠加起来就很致命。第二个坑是 PHP 数组的“双重身份”。在 PHP 里数组既是有序列表又是哈希表这个特性平时很爽但做题时容易产生认知混淆。比如你想维护一个严格的有序列表却用了关联数组的键名或者你想判断 key 是否存在却用了isset($arr[$key])结果 key 对应的值恰好是 null 时判断失败。理解底层行为才能避免这些边界错误。第三个坑是性能思维。PHP 虽然是脚本语言但机试数据量通常不会夸张到必须用 C 才能过不过如果写出 O(n²) 的嵌套循环n 到 10 万级别一样会超时。所以刷题时要刻意建立复杂度意识什么情况下用哈希表把查找从 O(n) 降到 O(1)什么情况下用二分把线性查找变成 O(log n)这些思维比背函数重要得多。机试里的 PHP 本质上就是一个高效的数据处理脚本它不需要处理 HTTP 请求也不需要考虑 MVC 分层把输入转成输出这个链路足够专注、也足够考验基本功。2. 高频考点的 PHP 实现模板数据结构是根2.1 字符串与数组处理机试的“送分题”也要写稳字符串处理在机试里占比最高但也是很多人丢分最冤的地方。PHP 的字符串函数非常多我把高频场景整理成了几组固定模板刷题时直接套用。第一组是输入清洗trim($line)去掉首尾空白preg_split(/\s/, $line)按任意空白分隔这比explode( , $line)更稳因为输入里可能混着多个空格。第二组是子串判断用str_contains($s, $sub)判断包含PHP 8用strpos($s, $sub) ! false兼容老版本注意必须用!而不是!因为子串出现在开头时strpos返回 0用!会被当成 false。第三组是字符操作。遍历字符串时可以先转数组$chars str_split($s)但更高效的方式是for ($i 0; $i strlen($s); $i)配合$s[$i]直接访问单个字符。对 ASCII 题目这样操作足够如果是中文或 Unicode 内容就要用mb_*系列函数比如mb_strlen、mb_substr否则会出现半个字符的诡异问题。我遇到过一道题要求反转句子中的单词顺序输入是 hello world 输出要求world hello用preg_split加array_reverse加implode三行搞定这种题一旦用错分隔符就会输出多余的空白。数组处理的核心模板也有几组。统计频率直接用array_count_values($arr)一行返回频率字典合并多个数组可以用array_merge但注意它会对字符串键做覆盖、对数字键做追加这个差异容易踩坑需要按某个字段排序时用usort($arr, fn($a, $b) $a[score] $b[score])。这些函数单独看都很简单但组合起来就能覆盖大量“送分题”。我的经验是字符串和数组模板一定要练到不需要思考就能写出来因为真正拉开分数的中难题往往也要先做字符串清洗才有后续。2.2 栈、队列与哈希表PHP 里不需要额外装库很多从 Java 转过来的朋友会在 PHP 里找Stack、Queue类其实没必要。PHP 的数组天生就能当栈和队列用入栈用array_push($arr, $val)出栈用array_pop($arr)入队用array_push出队用array_shift。不过要注意性能array_shift()会重置所有数字索引在数组很大的时候耗时明显。如果确实需要大量头部弹出操作建议改用SplQueue或SplStack这两个标准库类性能更好写法也不算复杂。哈希表就更直接了PHP 的关联数组就是有序哈希表$hash [a 1, b 2]就是 Java 里的HashMap。判断 key 是否存在时isset($hash[$key])的语义是“存在且不为 null”如果 value 可能为 null就要用array_key_exists($key, $hash)。这个区别在机试里出现过不止一次比如统计字符出现次数时某些字符确实可能出现 0 次或需要存 null 值用错函数就直接掉坑。栈的经典应用是括号匹配、表达式求值、单调栈。以括号匹配为例模板是先建映射数组$map [) (, ] [, } {]然后遍历字符串时遇到左括号入栈遇到右括号检查栈顶是否匹配最后判断栈是否为空。这段逻辑大概十行左右关键在“边界条件”这几行右括号比左括号多、左括号比右括号多、栈顶不匹配三种情况都要覆盖。单调栈稍微进阶一点模板是在遍历过程中维护一个值单调递增或递减的栈常用于求“下一个更大元素”“柱状图最大矩形”这类题思路熟了之后代码也不长。2.3 排序与二分复杂度敏感题目的必要储备排序在机试里很少要你手写快排直接用内置函数就行但必须搞清楚排序函数的差异。sort()会重新索引数组适合列表asort()保留键关联适合需要知道原始下标的场景ksort()按键名排序。还需要注意排序标志比如SORT_REGULAR、SORT_NUMERIC、SORT_STRING默认行为在处理混合类型时可能和你预期不一致。我用sort()排数字数组时曾经因为没加SORT_NUMERIC得到的结果是按字符串字典序排的10排在2前面这种错误在机试里很容易被忽略。二分查找是高频考点PHP 没有内置的二分函数array_search()是线性查找有序数组上直接用效率太低所以需要手写一个模板。核心逻辑是维护左右边界$l和$r取中点$mid intdiv($l $r, 2)根据中间值与目标值的大小调整边界。注意两点一是循环条件一般是$l $r二是计算中点用intdiv避免浮点数。模板熟练后像“查找插入位置”“旋转数组找最小值”都可以在这个基础上改。复杂度思维在这里要特别强调。机试题目数据范围通常会明说比如 n 最大 10^5。如果你的解法是 O(n²)最坏情况就是 10^10 次操作在 PHP 里基本跑不动但如果用哈希表降到 O(n)就是 10^5 次操作瞬间通过。所以每次写代码前先估算一下自己的算法复杂度再决定是用简单方法还是优化方法。3. 从思路到 AC三套完整解题过程拆解3.1 经典题一两数之和哈希法这道题几乎每个题库都有题目是给一个整数数组和一个目标值返回两个下标使它们对应的数字之和等于目标值。最直觉的解法是双重循环逐个配对复杂度 O(n²)。但用哈希表可以一次遍历搞定对每个元素先计算补数target - nums[$i]然后查这个补数是否已经存在哈希表里如果存在就直接返回两个下标否则把当前值存入哈希表。PHP 实现非常干净function twoSum($nums, $target) { $map []; foreach ($nums as $i $num) { $complement $target - $num; if (isset($map[$complement])) { return [$map[$complement], $i]; } $map[$num] $i; } return []; }这里需要注意一个细节为什么要“先查再存”而不是“先存再查”因为如果先存当前元素会立刻和自己配对。比如target 6当前元素是3先存了$map[3] $i再查补数时发现3已经在哈希表里就会返回[$i, $i]这显然是错的。另外$map[$complement]用isset判断还是用array_key_exists判断取决于题目里允许数组元素是否可能为 null数字场景用isset通常没问题。时间复杂度 O(n)空间复杂度 O(n)是典型的空间换时间。3.2 经典题二有效括号栈模拟题目是给一个只包含()[]{}的字符串判断括号是否匹配。一个容易想到的朴素思路是不断替换掉成对的()、[]、{}但那种做法既慢又容易出错。正确思路是栈模拟遍历时遇到左括号就压栈遇到右括号就检查栈顶是不是对应的左括号如果是就弹出不是就说明不匹配直接结束遍历结束后栈必须为空。我写的模板function isValid($s) { $map [) (, ] [, } {]; $stack []; for ($i 0; $i strlen($s); $i) { $ch $s[$i]; if (isset($map[$ch])) { $top array_pop($stack); if ($top ! $map[$ch]) { return false; } } else { array_push($stack, $ch); } } return $stack []; }写这个题时我踩过的坑是弹出空栈。如果字符串是]]开头第一次遇到右括号时栈还是空的array_pop返回 nullnull 不等于左括号所以能正确返回 false。但更稳的写法是先判断栈是否为空为空就直接返回 false这样逻辑更清晰。另外注意array_pop和$stack[] $val两种写法等效个人偏好用array_push可读性更高。时间复杂度 O(n)空间复杂度最坏 O(n)。3.3 经典题三最长回文子串中心扩展回文串是字符串题里的常客最长回文子串的解法很多最推荐先掌握中心扩展法。思路是以每个字符或每两个相邻字符之间的位置为中心向左右两边扩展直到两边字符不同为止记录最长的长度和起止位置。之所以要区分奇偶两种情况是因为回文串可以是单中心如aba也可以是双中心如abba。PHP 代码function longestPalindrome($s) { $n strlen($s); if ($n 2) return $s; $start 0; $maxLen 1; for ($i 0; $i $n; $i) { // 奇数长度的回文 $l $i - 1; $r $i 1; while ($l 0 $r $n $s[$l] $s[$r]) { $l--; $r; } $len $r - $l - 1; if ($len $maxLen) { $maxLen $len; $start $l 1; } // 偶数长度的回文 $l $i; $r $i 1; while ($l 0 $r $n $s[$l] $s[$r]) { $l--; $r; } $len $r - $l - 1; if ($len $maxLen) { $maxLen $len; $start $l 1; } } return substr($s, $start, $maxLen); }这里容易出错的地方是长度和起点的换算。扩展结束后左右指针已经越界或停在不相等的字符上所以实际回文区间是[$l 1, $r - 1]长度是$r - $l - 1起点是$l 1。我最初刷这道题时总是把$start算成$l导致结果多一个字符或少一个字符。为了避免这个错误可以另写一个辅助函数expandAroundCenter($s, $l, $r)返回以某个中心扩展出的最长长度再在主函数里比较并更新答案代码结构会更清晰。时间复杂度 O(n²)空间复杂度 O(1)在 PHP 里跑字符串长度 1000 以内的测试用例完全够用。4. 在线训练的实战流程与卡点排查4.1 从读题到提交的标准化流程在线训练最忌讳一上来就写代码。我自己总结了一个五步流程每步都有明确产出。第一步读题后立刻手写两个自定义测试用例一个常规用例、一个极端边界用例比如空数组、单个元素、全是重复元素。很多人不写用例直接编码结果最后查 bug 的时间比写代码还久。第二步判断题目属于哪类考点确定时间复杂度和空间复杂度目标。如果看到 n 10^5 就要警惕 O(n²)看到“有序数组”就条件反射想到二分。第三步在纸上或注释里写伪代码骨架把核心步骤列出来。比如括号匹配的骨架就是“遇到左括号入栈遇到右括号查栈顶最后看栈是否为空”。第四步按骨架逐行实现。写 PHP 时我会特别注意字符串比较用、取数组元素前判断 isset、循环里避免重复计算strlen($s)把它提到循环外面这个小优化在长字符串上能节省不少时间。第五步用第一步写的用例自测再补充几个攻击性用例超大输入、负数、混合大小写等。自测通过后再提交提交失败也别急着改代码先看是编译错误、超时还是答案错误不同类型的处理方向完全不同。4.2 超时、内存、边界问题速查表在线训练中反复出现的卡点类型其实就那么几类我把它们整理成了一张速查表每次提交失败先对照这张表定位能节省大量调试时间。现象常见原因处理方向输出格式错误多输出了调试信息或行尾空格不一致关闭所有print_r/var_dump用trim处理输入答案错误但本地测试正常边界条件没覆盖比如空输入、单元素检查循环边界补充极端用例超时嵌套循环、array_shift大数组、递归过深换哈希表/二分改用SplQueue改迭代内存超限存了超大二维数组或递归调用层数过多用流式处理减少不必要的中间数组undefined offset 报错访问数组不存在的下标先用isset或array_key_exists判断结果差一位二分边界或回文起点换算错误用具体小例子走一遍循环观察变量变化字符串比较失败大小写、编码差异统一转小写strtolower或使用strcasecmp这张表看起来简单但每一条背后都有真实教训。比如“输出格式错误”我遇到过好几次是在本地用print_r调试完忘记删掉提交后输出里混进了数组结构文本怎么改答案都不对。后来我养成一个习惯提交前最后一步搜索整个文件确认没有调试输出。再比如“内存超限”一次做矩阵旋转题时我用了一个新的二维数组存中间结果题目数据量大直接内存爆掉改成原地旋转后不仅内存降下来运行时间也快了一倍多。4.3 练题路线与时间分配建议在线训练刷题不能东一榔头西一棒子我建议分三个阶段走。第一阶段是“打模板”目标是用一周左右把所有高频题型的基础模板各写三遍包括字符串清洗、数组频率统计、栈模拟、二分查找、简单排序。这个阶段不求难题只求每次都把代码写规范尤其是输入输出和边界判断。第二阶段是“分类强化”每天挑两个题型比如今天做“哈希 栈”明天做“二分 排序”。每个题型做五道以上做完后在笔记里总结本题型的变体特征比如“看到找补数就想到哈希”“看到配对就想到栈”。第三阶段是“模拟考试”找专门的在线训练页面设置计时比如 90 分钟完成 3 道题模拟真实机试节奏。这一步非常关键因为平时做题可以慢慢想但限时状态下你的真实水平才会暴露。我在模拟考时经常出现的情况是第一道简单题花太久导致后面中难题时间不够。后来调整了策略简单题控制在 10 到 15 分钟内即使有些小瑕疵也先提交保底分中难题先花 5 分钟设计思路如果 20 分钟还没进展就果断跳过做完后面的题再回头补。从整体时间分配来讲我建议在线训练每天保持一到两小时周末可以拉长到半天。相比一次刷十个多小时每天稳定练反而更有效因为算法思维需要持续接触才能形成条件反射。等练到一定程度你看到题目描述的第一句话脑子里就会自动浮现出可能的数据结构和大致思路那时候就不再是“背题”而是真正形成了机试解题思维。我自己在练习后期最大的收获不是记住了多少模板而是养成了先想清楚再动手、写完代码必查边界的习惯这个习惯就算不考机试回到日常业务开发里也非常实用。

相关新闻

遮挡行人重识别实战:锚点重建与Mamba时序聚合提升10.6个点

遮挡行人重识别实战:锚点重建与Mamba时序聚合提升10.6个点

1. 遮挡行人重识别这个坑,为什么值得认真填行人重识别(ReID)说白了就是给系统一堆摄像头拍到的行人图,让它判断哪些图里是同一个人。这个任务在安防、智慧园区、商场客流分析里都是刚需,但真正落地的时候,最…

2026/10/13 12:13:08 阅读更多 →
AI编程时代如何应对代码Review负担:从被动确认到主动进化的四步法

AI编程时代如何应对代码Review负担:从被动确认到主动进化的四步法

1. “90% Review”是怎么发生的?先拆解这个比例背后的结构 1.1 代码产出链路的重量偏移:从“写”变成“选” 最近和一个做了多年后端开发的朋友吃饭,他说自己现在的工作日常非常单调:白天大部分时间在Review AI编程助手生成的代码…

2026/10/13 12:13:12 阅读更多 →
为Claude打造外部记忆层:从“失忆”到“带档案工作”的完整实践

为Claude打造外部记忆层:从“失忆”到“带档案工作”的完整实践

我最近在处理一个连续跑了两个月的项目时,反复碰到同一个让我很头疼的问题:Claude明明前两次会话里跟我敲定了方案细节、命名规则、接口约定,但只要我新开一个会话,它就变回“初来乍到”的状态,所有约定都要重新交代一…

2026/10/13 12:12:37 阅读更多 →

最新新闻

从零构建Agent技能库:技能层设计、动态装载与回归测试的工程实践

从零构建Agent技能库:技能层设计、动态装载与回归测试的工程实践

直接做Agent应用的人,这两年应该都有同感:单个Agent的对话能力已经不是瓶颈了,真正拉开差距的是Agent能不能稳定地调用外部能力、按流程完成任务。我最近在整理和重构一个内部项目,名字就叫“agent-skills”,本质上是一…

2026/10/13 20:34:36 阅读更多 →
基于MATLAB的脑电功率谱与多尺度熵分析工具箱实战解析

基于MATLAB的脑电功率谱与多尺度熵分析工具箱实战解析

简介:面向脑电信号分析的多尺度熵计算MATLAB代码包,主要服务神经科学、生物医学工程等领域的科研人员与工程师,可用于处理多通道EEG数据,完成从二进制文件读取、预处理、多尺度熵计算到频谱分析、批量统计的完整流程。代码由杨博士…

2026/10/13 20:34:36 阅读更多 →
用litellm搭建统一模型网关,解决多模型接入难题

用litellm搭建统一模型网关,解决多模型接入难题

1. 做了个模型网关,解决了我最头疼的多模型接入问题先交代一下背景。上个月要给一个内部工具接大模型能力,一开始需求很简单:调一个对话接口,把结果返回给前端就行。结果做着做着就失控了。产品那边今天说换某家的新模型试试&…

2026/10/13 20:34:36 阅读更多 →
吃透OpenCV类型宏CV_8UC3:位深通道与内存布局

吃透OpenCV类型宏CV_8UC3:位深通道与内存布局

写这篇文章的起因,是最近又看到不少人在图像处理群里问“为什么Mat创建老报错”“为什么读进来的图片和我心里想的不一样”,最后发现根子都出在同一个地方:没搞懂OpenCV的类型宏,比如CV_8UC3到底代表什么。这玩意儿看着像一串乱码…

2026/10/13 20:34:36 阅读更多 →
YOLOV4后处理解析:从NMS到DIOU-NMS的原理与Python实现

YOLOV4后处理解析:从NMS到DIOU-NMS的原理与Python实现

YOLOV4学习系列写到第三篇,前面咱们拆过CSPDarknet53骨干结构,聊过SPP和PANet的Neck设计,今天终于轮到推理阶段的最后一道工序——非极大值抑制。NMS这个词很多同学早就不陌生了,检测模型调试、比赛刷分、论文复现都绕不开它。但你…

2026/10/13 20:34:36 阅读更多 →
Zbrush次世代角色头部雕刻全流程:从结构认知到皮肤纹理

Zbrush次世代角色头部雕刻全流程:从结构认知到皮肤纹理

做次世代游戏角色,头部雕刻永远是绕不开的坎。常有人说,身体可以靠布料和铠甲遮,脸却始终暴露在玩家眼前,Zbrush头部细节雕刻直接决定了角色能站上哪个档次。这些年我经手过不少项目,也从大量废案里踩出一些实用的新技…

2026/10/13 20:33:28 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →