当前位置: 面试刷题>> 查找数组中的所有重复项 (经典算法题500道)


### 题目描述补充 **题目:查找数组中的所有重复项** 给定一个整数数组,找出数组中所有重复的元素(即元素在数组中至少出现两次),并返回它们的列表。数组中元素的范围在1到n之间(包含1和n),且n是数组的长度。 **示例输入**: ``` [4, 3, 2, 7, 8, 2, 3, 1] ``` **示例输出**: ``` [2, 3] ``` ### PHP 代码示例 ```php function findDuplicates($nums) { $n = count($nums); $result = []; $map = array_fill(1, $n + 1, 0); // 初始化一个映射表,范围从1到n+1 // 遍历数组,记录每个元素出现的次数 foreach ($nums as $num) { if ($map[$num] == 1) { $result[] = $num; // 如果出现次数为1,则记录到结果数组中 } $map[$num]++; } return $result; } // 示例 $nums = [4, 3, 2, 7, 8, 2, 3, 1]; $duplicates = findDuplicates($nums); print_r($duplicates); ``` **注意**:上述PHP代码实现是基于题目的一般性解法,但在本题特定条件(元素范围在1到n之间)下,可以利用数组索引进行更高效的解决,此处为了通用性未采用该方法。 ### Python 代码示例 ```python def findDuplicates(nums): result = [] n = len(nums) # 利用元素值作为索引,通过取负值标记元素已出现 for num in nums: index = abs(num) - 1 if nums[index] < 0: result.append(abs(num)) else: nums[index] = -nums[index] # 恢复原数组(如果需要) for i in range(n): if nums[i] < 0: nums[i] = -nums[i] return result # 示例 nums = [4, 3, 2, 7, 8, 2, 3, 1] duplicates = findDuplicates(nums) print(duplicates) ``` ### JavaScript 代码示例 ```javascript function findDuplicates(nums) { const result = []; const n = nums.length; const map = new Map(); // 遍历数组,统计每个元素的出现次数 for (let num of nums) { if (map.has(num)) { result.push(num); // 如果元素已存在,则加入结果数组 } else { map.set(num, true); } } return result; } // 示例 const nums = [4, 3, 2, 7, 8, 2, 3, 1]; const duplicates = findDuplicates(nums); console.log(duplicates); ``` **码小课**:在编程学习和面试准备中,理解数组和哈希表(在JavaScript中为Map或Object,在Python中为dict,在PHP中为数组或SplObjectStorage等)的应用是非常关键的。通过这类问题,可以很好地锻炼我们的算法思维和编码能力。码小课网站上有更多关于数组、哈希表、排序算法等内容的分享,欢迎大家前往学习,提升自我。
推荐面试题