如何检查数组是否恰好包含特定整数集合?以1、0、0、1为例
检查数组是否恰好包含特定整数集合的方案
嘿,这个问题很常见,我来给你拆解两种场景的解决方案——先搞定你提到的[1,0,0,1]的具体需求,再讲通用的检查方法。
一、针对特定需求:检查数组是否恰好包含1、0、0、1
这里的核心是元素种类和对应出现次数完全匹配,不能多也不能少,推荐两种简单的实现思路:
1. 排序后直接对比
把原数组和目标数组都排序,然后比较两者是否完全一致。这种方法代码简洁,适合元素数量不多的场景:
// JavaScript示例 function matchesTarget(array) { // 先判断长度,长度不对直接排除 if (array.length !== 4) return false; // 数字排序要传比较函数,避免字符串排序的坑 const sortedArr = array.sort((a, b) => a - b); const targetSorted = [0, 0, 1, 1].sort((a, b) => a - b); // 逐元素对比更严谨,也可以转成字符串对比 return sortedArr.every((val, idx) => val === targetSorted[idx]); }
2. 统计元素出现次数
用哈希表统计每个数字的出现次数,再和目标次数对比。这种方法更灵活,能明确处理重复元素的次数要求:
// JavaScript示例 function matchesTarget(array) { if (array.length !== 4) return false; // 统计原数组元素计数 const countMap = array.reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {}); // 目标计数:0出现2次,1出现2次 const targetMap = { 0: 2, 1: 2 }; // 检查所有键是否匹配,且次数一致 const keysMatch = Object.keys(countMap).length === Object.keys(targetMap).length; const countsMatch = Object.keys(targetMap).every(key => countMap[key] === targetMap[key]); return keysMatch && countsMatch; }
如果是Python的话,用标准库的Counter会更省心:
from collections import Counter def matches_target(array): return Counter(array) == Counter([1, 0, 0, 1])
二、通用方案:检查数组是否恰好包含任意特定整数集合
不管目标集合是什么,核心逻辑都是验证元素的种类、每个元素的出现次数、总长度三者完全匹配,推荐两种通用方法:
1. 排序对比法
步骤:
- 先判断原数组和目标数组的长度是否一致,不一致直接返回
false - 对两个数组进行排序(注意数字排序要避免字符串排序的陷阱)
- 逐元素对比,或者转成字符串/元组对比
优点:代码简洁,易理解;缺点:排序的时间复杂度是O(n log n),元素较多时效率稍低。
2. 计数统计法
步骤:
- 同样先判断长度是否一致
- 用哈希表(如JS的
Map/对象、Python的Counter)统计原数组和目标数组的元素出现次数 - 对比两个哈希表的键和对应的值是否完全相同
优点:时间复杂度O(n),效率更高;适合元素数量大、重复元素多的场景。
注意事项
- 如果数组里可能包含非整数元素,要先过滤或验证类型,避免统计错误
- 对于严格类型检查的语言(如TypeScript),要确保数组元素是
number类型的整数
内容的提问来源于stack exchange,提问作者user9402741
相关产品推荐
相关产品推荐

