本文介绍如何在 javascript 数组中,一次性找出所有满足“起始字符出现在前、结束字符出现在后且位置递增”条件的索引对(如 'a'→'c'),避免分步收集再嵌套遍历,提升可读性与执行效率。
本文介绍如何在 javascript 数组中,一次性找出所有满足“起始字符出现在前、结束字符出现在后且位置递增”条件的索引对(如 'a'→'c'),避免分步收集再嵌套遍历,提升可读性与执行效率。
在处理字符串或字符数组时,一个常见需求是:给定两个目标字符(如 start = 'a'、end = 'c'),找出所有满足 i 不是简单地取首个 'a' 和首个 'c',而是要穷举所有合法的前后配对。
例如,对数组 ['a', 'b', 'c', 'd', 'e', 'a', 'c'],所有 'a' 出现在索引 0 和 5,所有 'c' 出现在索引 2 和 6。合法配对必须满足“a 在 c 前”,因此有效组合为:
- 0 → 2(0
- 0 → 6(0
- 5 → 6(5
⚠️ 注意:5 → 2 无效(因 5 > 2),故不能简单按顺序取对应位置(如 a[0] 配 c[0]、a[1] 配 c[1]),而需完整笛卡尔积过滤。
✅ 推荐解法:双指针 + 索引预收集(清晰、高效、易扩展)
最直观且性能良好的方式是——先分别收集 start 和 end 的所有索引,再用双层循环生成所有 i
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
function findAllIndexPairs(arr, startChar, endChar) {
const starts = [];
const ends = [];
for (let i = 0; i <p>该方案时间复杂度为 <em>O(n + s×e)</em>(n 为数组长度,s/e 分别为起始/结束字符出现次数),空间复杂度 <em>O(s + e)</em>,逻辑清晰,便于调试与维护。</p><h3>⚠️ 关于原答案的说明</h3><p>原回答中使用 reduce + 动态对象集合的方式,本意是“边遍历边配对”,但其逻辑存在关键偏差:它试图将同一对象中同时包含 'a' 和 'c' 视为一对,实际生成的是 [0,2] 和 [5,6] —— <strong>遗漏了 [0,6]</strong>,且隐含假设每个 'a' 只匹配最近的 'c',不符合题干“所有对”的要求。因此该实现不满足原始问题语义,仅作思路参考,不建议直接采用。</p><h3>✅ 进阶优化(适用于超大数组)</h3><p>若数组极长但目标字符稀疏,可进一步优化为单次遍历 + 向后查找:</p><pre class="brush:php;toolbar:false;">function findAllIndexPairsOptimized(arr, startChar, endChar) {
const pairs = [];
// 预先记录所有 end 索引,用于二分查找(若需极致性能)
const endIndices = arr.map((c, i) => c === endChar ? i : -1)
.filter(i => i !== -1);
for (let i = 0; i i) pairs.push([i, j]);
}
}
}
return pairs;
}总结
- ✅ 首选方案:分步收集索引 + 嵌套过滤,代码简洁、语义明确、易于测试;
- ❌ 避免“贪心配对”或混淆“同对象聚合”逻辑,确保覆盖全部 i
- ? 如需支持多字符对(如 'a'→'b' 或 'x'→'y'→'z'),可将函数泛化为接受字符序列与滑动窗口逻辑;
- ? 实际项目中,建议增加输入校验(如 Array.isArray(arr)、字符非空等)以增强鲁棒性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










