含重复元素的旋转排序数组:二分查找返回最小索引全解析
这几天我帮几位准备算法面试的朋友做复盘发现“二分法”这个看似基础的话题被问到最高频的其实是这道变体搜索旋转排序数组数组里允许包含重复元素并且要求返回目标值的最小索引。说它是“压垮”半数候选人的题并不夸张——无重复版本的大体思路很多人都能背下来但一旦同时加上“含重复元素”和“返回最小索引”两个约束现场就容易卡住甚至写错边界条件。这篇文章我会沿着面试现场的思路从旋转数组的本质开始一步步推导出可用的二分代码再讨论复杂度、边界用例、面试沟通技巧以及我实际调试中踩过的坑。不管你是刚开始刷题还是准备系统复习二分法这篇文章的目标都是让你能把这道题讲明白、写对、扛住追问。1. 先看清楚题旋转数组的“两段有序”1.1 什么是旋转排序数组形态与来源旋转排序数组本质上是一个原本非递减排列的数组从某个位置被“切开”后左右两半交换位置。举个例子原数组是[0, 1, 2, 4, 5, 6, 7]从索引 3 处切开变成[4, 5, 6, 7, 0, 1, 2]这就是一次旋转。数组旋转之后整体不再是全局有序的但它有一个非常特殊的结构断层点左侧是一段有序区间断层点右侧是另一段有序区间而且无重复情况下左段的所有元素都大于右段的所有元素。你可以这样理解假设有一本按字母序排列的字典被人从中间撕开再把前后两半对调。每一半内部的字母顺序仍然是正确的但整本书的字母序在接缝处出现了一个“断层”。二分查找之所以还能在这里使用就是因为我们依然可以利用“每一段内部有序”这个规律。如果没有发生旋转数组就是完全有序的这是最简单的退化情况。如果数组里还允许重复值比如原数组是[0, 1, 1, 2, 2, 3]旋转后可能变成[2, 3, 0, 1, 1, 2]或[1, 2, 2, 3, 0, 1]那么“左段大于右段”这个特征也会变得模糊。这一点先记住后面会详细展开。1.2 二分为什么还适用从“全局有序”降级为“两段有序”普通二分查找依赖数组的全局单调性比较nums[mid]和target之后可以确定目标值落在哪一半。旋转数组没有全局单调性但具备“局部有序性”——无论mid落在哪个位置它都一定落在左段或右段之一而且至少有一侧是整体有序的。无重复情况下判断mid落在哪一段看的不是nums[mid]和target的比值而是nums[mid]和nums[left]的大小关系如果nums[mid] nums[left]说明mid位于左侧有序段内此时[left, mid]这一段严格递增可以像普通二分一样判断target是否落在这段区间里。如果nums[mid] nums[left]说明旋转点在左半段mid已经滑到了右侧有序段此时[mid, right]这一段严格递增。所以思路的核心转变是不要试图在整个数组上做二分而是先通过 mid 和 left 的关系找到哪一侧是有序的然后在有序的那一侧判断目标的位置。这个思维转变是理解整道题的地基。2. 重复元素与最小索引这道题真正难在哪2.1 重复元素让“旋转点”失效在无重复数组里nums[mid] nums[left]是一个很可靠的判断依据。但一旦数组里出现重复值问题立刻变味了。比如[1, 0, 1, 1, 1]初始时left 0right 4mid 2。此时nums[left] 1nums[mid] 1两者相等。那么问题来了mid到底位于左段还是右段仅凭nums[mid] nums[left]我们无法判断。它可能是左段末尾的一个重复值也可能是右段开头的一个重复值。这种情况下nums[mid] nums[left]的条件退化了我们不能继续用无重复版本的二分逻辑。再比如[1, 1, 1, 0, 1, 1, 1]这个数组确实是旋转排序数组旋转点在0和后面那个1之间。但nums[left] nums[right] 1左段和右段的边界值相同判断起来就更加麻烦。这是整道题最关键的一个分水岭重复元素让“哪一段有序”的判断变得不确定。2.2 “返回最小索引”意味着命中不能直接返回普通旋转数组版本的写法通常是if nums[mid] target: return mid找到就返回非常干脆。但题目要求“返回最小索引”也就是返回target第一次出现的位置。如果数组里存在多个相同值第一次命中的位置未必是最小索引。举个例子nums [2, 2, 2, 0, 2, 2] target 2真实最小索引是 0。但标准二分可能先命中索引 2 或者索引 4。如果此时直接返回答案就是错的。正确的做法是维护一个ans变量一旦nums[mid] target先记录ans mid然后继续在左半段搜索看是否存在更靠左的目标值。直到搜索区间为空ans里保存的一定是最小索引。如果始终没有命中ans保持初始值-1。这也意味着代码里不能使用“命中即返回”的结构而要把命中分支改成“记录并继续收缩”。2.3 相等时的三值关系一张表理清决策当nums[left]、nums[mid]、target三者之间出现相等关系时很多人容易乱。先把最核心的判别关系整理出来条件可判断的信息处理策略nums[mid] target已经找到一个答案记录ans mid并让right mid - 1继续向左找更小索引nums[left] nums[mid]无法判断 mid 在哪一段左边界left 1跳过这个已知不等于 target 的歧义位置nums[left] nums[mid]左半段[left, mid]非递减有序按nums[left] target nums[mid]判断 target 是否在左半段nums[left] nums[mid]右半段[mid, right]非递减有序按nums[mid] target nums[right]判断 target 是否在右半段很多面试者忽略了最后一种相等情况nums[mid] nums[right]同样会造成判断困难。不过在我们的策略里统一用“处理左边界相等”的方式规避代码结构会更简单后面我会详细说明。3. 从暴力到最终实现四步推导3.1 第一步暴力解法别急着写二分拿到这道题最简单的解法当然是线性扫描def search_brutal(nums, target): for i, v in enumerate(nums): if v target: return i return -1时间复杂度O(n)空间复杂度O(1)。暴力解的优点是绝对正确尤其在调试二分代码时可以作为对照答案验证结果。面试时千万不要上来就交暴力解但可以在开场白里提一句“如果不管性能线性扫描是很直接的方案。我来尝试利用旋转数组的有序性把平均复杂度降到O(logn)。”这样既展示了基础能力又自然引出二分。3.2 第二步无重复版本的旋转二分先处理无重复元素的经典版本。这个版本是理解后续所有优化的前提def search_simple(nums, target): left, right 0, len(nums) - 1 while left right: mid (left right) // 2 if nums[mid] target: return mid if nums[mid] nums[left]: # 左半段有序 if nums[left] target nums[mid]: right mid - 1 else: left mid 1 else: # 右半段有序 if nums[mid] target nums[right]: left mid 1 else: right mid - 1 return -1这个版本的判断逻辑是nums[mid] nums[left]说明 mid 落在左段[left, mid]严格递增。nums[mid] nums[left]说明 mid 落在右段[mid, right]严格递增。这里有一个细节值得留意判断 target 是否在左半段时我写的是nums[left] target nums[mid]右侧是开区间。因为nums[mid] target的情况已经在前面用一个独立分支处理过了所以不需要包含mid本身。同样右半段用nums[mid] target nums[right]左侧开、右侧闭。3.3 第三步命中不等于结束答案要继续向左收缩把“返回最小索引”这个要求加进去只需要修改命中分支if nums[mid] target: ans mid right mid - 1 continue原本的return mid变成了“记录答案 收缩右边界”。这里用continue而不是直接结束是因为right更新后循环条件left right需要重新检查同时mid也要重新计算。这个改动的本质是即使当前命中的位置已经是一个有效答案它也可能不是最小索引。目标值在数组里可能出现了多次左侧可能还有更早的出现位置。收缩右边界后搜索区间被限制在已知答案的左侧继续找更小索引。提交答案前别忘了初始化ans -1循环结束返回ans。3.4 第四步处理nums[left] nums[mid]的歧义分支现在处理重复元素带来的“无法判断哪段有序”的问题。当nums[left] nums[mid]且nums[mid] ! target时最安全的操作是if nums[left] nums[mid]: left 1 continue为什么可以放心地left 1不会跳过潜在答案关键在于顺序nums[mid] target的分支已经被优先处理了。也就是说走到这个分支时nums[mid]一定不等于target。而nums[left] nums[mid]意味着nums[left]也一定不等于target。因此把left向右移动一位跳过的那个元素绝对不是 target安全。这个结论很重要面试中如果要解释这一行的安全性就直接说这一点。为什么不选择right - 1两种方式在原理上都可行但既然题目要求的是“最小索引”我们要尽可能让搜索重心偏左。统一使用left 1会让后续逻辑更容易保持一致也便于自己检查。3.5 完整代码Python 最终模板把四步合并得到完整的实现def search(nums, target): n len(nums) left, right 0, n - 1 ans -1 while left right: mid (left right) // 2 # 1. 命中目标记录答案并继续向左寻找更小索引 if nums[mid] target: ans mid right mid - 1 continue # 2. 左边界值等于中值无法判断 mid 在哪一段安全跳过 if nums[left] nums[mid]: left 1 continue # 3. 左半段有序 if nums[left] nums[mid]: if nums[left] target nums[mid]: right mid - 1 else: left mid 1 # 4. 右半段有序 else: if nums[mid] target nums[right]: left mid 1 else: right mid - 1 return ans如果只想记忆一个模板这个就是你要背的版本。代码量不大但每个分支都有明确的语义。我把注意力集中在这几个点上left right作为循环条件保证区间为空时退出。每个分支都在缩小搜索区间不会产生死循环。命中优先歧义靠左边界跳过最后才是正常的有序段判断。4. 复杂度分析与边界用例4.1 平均 O(logn)最坏 O(n) 的退化路径正常旋转数组中的二分每次循环都会把搜索范围缩小一半所以大多数情况下时间复杂度是O(logn)空间复杂度是O(1)。但重复元素会把复杂度拖高。最典型的情况是数组里几乎所有元素都相等比如nums [1, 1, 1, 1, 1, 1] target 2每一次循环都会进入nums[left] nums[mid]分支执行left 1然后继续循环。一次循环只排除一个元素整体退化成了线性扫描。所以这道题的完整复杂度结论应该是平均情况下接近 O(logn)最坏情况下是 O(n)。面试官问到这一点的概率很高。正确的回答方式不是假装最坏也是 O(logn)而是承认这确实是重复元素带来的代价并解释退化的触发条件当数组两端和中点反复出现相同值且这个值不等于 target 时就无法通过二分快速排除大量元素。4.2 测试用例表这十组用例过了就稳了二分法边界问题极其隐蔽光靠肉眼检查代码很难发现问题。我常用的做法是准备一组覆盖各种极端情况的测试用例每次改完都跑一遍。下面这组用例基本够用用例target预期结果覆盖点[]1-1空数组[4, 5, 6, 7, 0, 1, 2]04常规无重复目标在右段[4, 5, 6, 7, 0, 1, 2]51常规无重复目标在左段[1, 1, 1, 1, 0, 1, 1]04重复元素包裹断点[1, 1, 1, 1, 0, 1, 1]10目标有重复且最小索引在最左[1, 1, 2, 1, 1]22中间值唯一[1, 1, 2, 1, 1]10大量重复目标[2, 2, 2, 2, 2]3-1全相等且不存在目标[1, 0, 1, 1, 1]01经典歧义用例[5, 1, 2, 3, 4]11旋转点在开头附近其中[1, 0, 1, 1, 1]是一个非常具有迷惑性的用例。如果你使用无重复版本的nums[mid] nums[left]逻辑它会误判左半段有序进而把搜索区间引导到错误的方向。只有显式处理nums[left] nums[mid]分支才能得到正确结果。4.3 一步步演算一个边界例子我挑一个最能说明问题的例子把代码的执行过程完整走一遍nums [1, 0, 1, 1, 1] target 0初始状态left 0right 4ans -1。第一次循环mid 2nums[2] 1不等于 target。nums[left] nums[mid]1 1条件成立执行left 1。此时left 1right 4。第二次循环mid (1 4) // 2 2nums[2] 1不等于 target。nums[left] 0nums[mid] 1nums[left] nums[mid]说明[left, mid]段也就是[0, 1]是递增有序的。nums[left] target nums[mid]即0 0 1成立所以right mid - 1 1。第三次循环left 1right 1mid 1。nums[1] 0等于 target命中。ans 1right mid - 1 0。此时left 1 right 0循环结束。返回ans 1正确。这个例子完美演示了左边界跳过策略如何消除歧义第一次循环如果没有left 1代码就会把左半段当成完全有序从而错误地排除包含目标值的区间。5. 面试现场怎么讲才显得你理解得深5.1 拿到题先问这三个问题不要在拿到题目后直接闷头写代码。面试官期待你做的第一件事是澄清需求。针对这道题我建议至少确认三个信息数组是否可能为空如果为空应返回什么重复元素的分布有没有限制最坏情况是不是所有元素都相同“返回最小索引”是指目标值第一次出现的位置对吗这三个问题不只是为了获取信息更是为了展示你的思维严谨性。尤其第三个问题直接决定代码里“命中后继续向左搜索”这一步是必要还是可省略。能主动想到这一点的候选人通常都能给面试官留下好印象。5.2 思路讲述顺序面试中讲思路的顺序我习惯按“暴力解法 → 为什么能用二分 → 重复带来的问题 → 完整解法 → 复杂度分析”来组织先说暴力解法的复杂度表明你知道基线在哪里。再说旋转数组的两段有序特性说明为什么可以尝试二分。然后指出重复元素会让“哪段有序”的判断产生歧义因此必须特殊处理。接着给出完整代码边写边解释每个分支的含义。最后主动说明复杂度包括最坏情况退化为 O(n) 的路径。这样讲的好处是逻辑完整面试官可以轻松跟上你的思路。即使代码写不出来清晰的思路也能带来许多加分。5.3 面试官最常追问的三个点追问一为什么最坏复杂度是 O(n)能不能避免不能完全避免。因为重复元素让信息量下降最坏情况下每次只能排除一个元素例如全等数组。想通过预处理等方式规避效果有限反而会增加代码复杂度。面试官考察的是你是否诚实面对这个瓶颈而不是试图掩盖它。追问二为什么不先找旋转点再对两段分别做二分理论上可行但在有重复元素的数组里找旋转点本身也需要面对nums[mid] nums[left]的歧义问题等于把同样的难题搬到了另一段代码里。综合来看直接在原数组上二分更简洁不需要额外空间。追问三left 1会不会跳过一个合法的目标位置不会。走到这个分支的前提是nums[mid] ! target而nums[left] nums[mid]所以nums[left]也一定不等于 target。跳过它不会丢失答案。这一点解释清楚面试官会非常认可你的代码安全意识。6. 我踩过的坑常见错误与排查实录6.1 死循环循环条件与 right 收缩的配合二分法的死循环问题是个经典陷阱。有些人在写这种旋转数组时会习惯性地用while left right作为循环条件然后在分支里用right mid而不是right mid - 1。一旦命中条件无法让 left 或 right 严格移动循环就会卡住。我的经验是统一使用while left right并且收缩边界都用mid ± 1。这样区间每次都会严格缩小从机制上避免死循环。唯一例外是nums[left] nums[mid]分支里用的left 1这也是严格的区间缩小操作。如果发现自己写的二分陷入了死循环最快的排查方法是打印每一轮的三个关键变量while left right: mid (left right) // 2 print(left, mid, right, nums[mid])看到 left 和 mid 一直没变化基本就是某个分支没有正确移动边界。6.2 撞上“等于”的右边界nums[mid] nums[right]我在早期版本里只处理了nums[left] nums[mid]结果在一个例子中仍然出错nums [1, 1, 1, 1, 0] target 0实际上这个数组已经足够典型初始left 0right 4mid 2nums[left] nums[mid]会触发left 1。等到left 2时nums[left] 1nums[mid] 0nums[left] nums[mid]进入右半段有序分支后续能找到结果。但有的变体写法判断nums[mid] nums[right]认为右半段有序。如果 target 在nums[right]附近并且nums[mid] nums[right]恰好成立就可能走错方向。我的建议是不要同时处理两边相等的情况只处理nums[left] nums[mid]其他情况都留给有序段判断。这样逻辑分支更少测试更可控。6.3 一个真实调试现场回放朋友 A 在写这道题时卡在了一个很隐蔽的用例上nums [1, 1, 1, 1, 1, 2, 2, 1, 1] target 2他的代码没有处理nums[left] nums[mid]分支结果mid一直落在值全为 1 的区域搜索区间无法收敛最后超时。我让他加了一行打印发现前几轮输出长这样left0 mid4 nums[mid]1 left0 mid4 nums[mid]1 left0 mid4 nums[mid]1left 和 mid 完全没变化这就是典型的“歧义未处理”导致的死循环。加上if nums[left] nums[mid]: left 1之后left 逐步推进最终到达索引 5定位到 target 的第一个 2返回 5。调试这类问题我的习惯是先确认有没有进入歧义分支再看是否推进了 left 或 right。大多数二分错误都出在这两件事上。6.4 快速自查口诀我把这道题的核心要点编成了一个自查口诀写完代码后对着念一遍能避免大多数低级错误命中先记下区间向左右命中后用ans midright mid - 1继续找更小索引。等值无法判左边界后移遇到nums[left] nums[mid]执行left 1。左段有序看前界右段有序看后界根据nums[left] nums[mid]或nums[left] nums[mid]选择判断公式。循环不缩空间必死每个分支都要保证 left 或 right 严格移动。这个口诀不是万能模板但每次写完后用它快速检查基本能保住边界正确性。我个人的体会是这道题表面上考的是二分法的写法实际考的是你对“循环不变量”的理解。你能否清楚地说明while 循环开始时答案有可能存在哪个区间重复值把信息抹掉之后你的每一轮还剩下哪些确定信息想清楚了这些问题旋转数组、重复元素、最小索引这些变体就都是同一套思路的自然延伸。刷题时与其背代码不如拿几个含重复元素的小数组在纸上把 left、mid、right 的变化一步步推演几遍。推演几次之后你会发现那些看起来复杂的边界其实只是几个简单规则反复叠加的结果。

相关新闻

SciTE4AutoHotkey:轻量专用编辑器,高效调试编译AHK脚本的完整指南

SciTE4AutoHotkey:轻量专用编辑器,高效调试编译AHK脚本的完整指南

简介:SciTE4Autohotkey 是一款专为 Autohotkey 脚本语言打造的源代码编辑器,面向需要编写自动化脚本、热键映射与系统级操作的中高级开发者,同时也适合初学者快速上手;基于 Scintilla 组件实现轻量快速启动,深度整合了…

2026/10/14 7:16:36 阅读更多 →
MNIST手写数字识别:PCA降维与KNN分类实战全解析

MNIST手写数字识别:PCA降维与KNN分类实战全解析

MNIST手写数字识别算是机器学习里最经典的入门案例之一,但经典玩法也有讲究。我最近用Python重新跑了一遍“PCA降维KNN分类”这条老路线,测试集准确率稳定在97%上下。这个数字放在深度学习时代确实不算惊艳,但你换个角度想:一套完…

2026/10/14 7:16:36 阅读更多 →
dnSpy 6.1.3 逆向实战:.NET反编译、调试与IL补丁

dnSpy 6.1.3 逆向实战:.NET反编译、调试与IL补丁

简介:dnSpy-6.1.3-net472.zip 是一款面向 .NET 开发者的反编译与调试工具安装包,基于 .NET Framework 4.7.2 构建,适用于 Windows 平台。它集反编译、调试与代码编辑于一体,可将程序集元数据和 IL 代码还原为 C# 或 VB.NET 源码&a…

2026/10/14 7:16:36 阅读更多 →

最新新闻

模型上下文协议MCP实战:从架构原理到工具集成落地

模型上下文协议MCP实战:从架构原理到工具集成落地

1. 从一个真实困境说起:为什么我们需要模型上下文协议如果你最近半年在关注大模型应用开发,大概率会反复听到一个词——MCP,也就是模型上下文协议(Model Context Protocol)。我第一次接触这个概念的时候,心…

2026/10/14 8:11:50 阅读更多 →
大智慧通达信交易插件TradeX-TPS:量化下单中间件原理与实战配置

大智慧通达信交易插件TradeX-TPS:量化下单中间件原理与实战配置

简介:这是一套面向股票量化交易与自动化下单场景的插件工具,适配大智慧、通达信两大行情软件,通过TradeX.dll或Trade.dll连接券商服务器,实现买入、卖出、撤单、按预设比例清仓,以及账户信息、持仓和可撤单信息的查询&…

2026/10/14 8:11:50 阅读更多 →
模型上下文协议MCP实战:从零搭建本地文件检索服务

模型上下文协议MCP实战:从零搭建本地文件检索服务

1. 模型上下文协议到底在解决什么问题第一次听到“模型上下文协议”这个词,很多人会以为它又是一个新的大模型训练框架,或者某种提示词模板规范。其实都不是。它要解决的是一个更底层、更工程化的问题:当大语言模型需要和外部世界打交道时&am…

2026/10/14 8:11:50 阅读更多 →
BepInEx 6.0 IL2CPP 插件框架:加载机制、配置排查与稳定性实践

BepInEx 6.0 IL2CPP 插件框架:加载机制、配置排查与稳定性实践

BepInEx 6.0 IL2CPP 插件框架:加载机制、配置排查与稳定性实践 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx 是一个面向 Unity 与 .NET 游戏的插件&#xff…

2026/10/14 8:11:50 阅读更多 →
context-mode:基于SQLite+FTS5+BM25的上下文调度工程实践

context-mode:基于SQLite+FTS5+BM25的上下文调度工程实践

1. “context-mode”到底是什么?别被术语唬住,它本质是让AI真正“听懂上下文”的工程化方案最近在多个技术社区和开源项目讨论里,“context-mode”这个词出现频率陡增,尤其和MCP、SQLite、FTS5、BM25这些词高频绑定。很多人第一反…

2026/10/14 8:11:50 阅读更多 →
AI辅助量化策略开发:从零搭建ETF轮动回测框架

AI辅助量化策略开发:从零搭建ETF轮动回测框架

1. 为什么说现在是个人做量化的最好时机我接触量化交易差不多有七八年了,最早那会儿,个人想做一套自己的策略,门槛高得离谱。你得自己搭数据库、自己写回测框架、自己处理除权除息、自己搞行情接口,光是数据清洗就能耗掉大半个月。…

2026/10/14 8:10:50 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/14 7:53:34 阅读更多 →