当前位置: 面试刷题>> 查找数组中的所有重复项 (经典算法题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等)的应用是非常关键的。通过这类问题,可以很好地锻炼我们的算法思维和编码能力。码小课网站上有更多关于数组、哈希表、排序算法等内容的分享,欢迎大家前往学习,提升自我。