用Set结构避免重复并提升查找效率,先将一数组转为Set再筛选另一数组,结果天然去重;需按原序则用filter+has,需键名则用array_intersect;多数组交集需统计元素出现的数组个数;注意类型安全与边界处理。

用Set结构避免重复,提升查找效率
直接遍历两个数组做嵌套比较(O(n×m))在数据量稍大时就会明显变慢。更优解是把其中一个数组转成Set,利用其唯一性和O(1)平均查找性能。比如JavaScript中:
- 先用
new Set(nums1)构建查找表 - 再用
nums2.filter(x => set1.has(x))快速筛选 - 结果天然去重,无需额外处理重复元素
保留原始顺序与键名的实用取舍
交集结果是否要按第一个数组顺序排列?是否需保留原始键名?这直接影响实现方式:
- 要顺序:用
filter()配合includes()或has(),不打乱原序 - 要键名(如PHP关联数组):用
array_intersect(),它保留首数组的键;若需严格类型匹配,加第三个参数true启用in_array(..., true) - Bash中无原生键名概念,但可通过索引映射模拟,例如用
declare -A关联数组存“值→原始索引”
多数组场景下统计出现频次再筛选
当需要找“至少出现在两个数组中的元素”(非全交集),不能只套用两两交集逻辑:
- 先对每个子数组用
Set去重,避免同一数组内重复计数 - 把所有去重后的元素合并进一个扁平数组
- 统计每个值出现的子数组个数(不是总次数)
- 筛选出现次数 ≥ 2 的值即可
注意类型安全与边界情况
看似简单的“相等判断”,实际常因类型隐式转换出错:
- PHP中
array_intersect()默认松散比较,"1"和1会被视为相同——需改用in_array($v, $b, true) - JavaScript中
Set区分1和"1",但==会误判,务必用===或has() - Bash字符串比较默认逐字节,注意空格、换行、大小写;建议统一用
printf "%s\n"输出再处理










