如何正确检查两个数组是否满足元素匹配的数量要求?
解决数组元素频次匹配问题
要解决这个既要检查元素存在、又要限制出现次数的问题,核心是统计第一个数组的元素频次,再逐个校验第二个数组的元素是否在频次范围内。
实现思路
- 先统计第一个数组中每个元素的出现次数,用
Map存储键值对(元素为键,出现次数为值) - 遍历第二个数组的每一个元素:
- 如果元素不在Map里,或者剩余次数已经为0,直接返回
false - 否则,把该元素的剩余次数减1
- 如果元素不在Map里,或者剩余次数已经为0,直接返回
- 所有元素都校验通过后,返回
true
代码实现
function canMatch(firstArr, secondArr) { // 统计第一个数组的元素频次 const countMap = new Map(); for (const item of firstArr) { countMap.set(item, (countMap.get(item) || 0) + 1); } // 遍历第二个数组校验 for (const item of secondArr) { const currentCount = countMap.get(item); if (!currentCount) { // 元素不存在或次数已耗尽 return false; } countMap.set(item, currentCount - 1); } return true; } // 测试案例 const first1 = [1,2,3,4]; const second1 = [1,2]; console.log(canMatch(first1, second1)); // 输出: true const first2 = [1,2,3,4]; const second2 = [3,3]; console.log(canMatch(first2, second2)); // 输出: false // 额外测试:正常的重复元素场景 const first3 = [2,2,3,3,3]; const second3 = [2,3,3]; console.log(canMatch(first3, second3)); // 输出: true
为什么这个方法可行?
- 用
Map统计频次的时间复杂度是O(n)(n是第一个数组的长度),遍历校验的时间复杂度是O(m)(m是第二个数组的长度),整体效率很高 - 每次校验后实时扣减频次,能准确跟踪剩余可用的元素数量,避免了原代码只检查存在性的问题
内容的提问来源于stack exchange,提问作者Baglan Abdirassil
相关产品推荐
相关产品推荐

