vector查找重复元素下标
时间: 2025-05-11 22:30:50 浏览: 29
### 如何在 `vector` 中找到重复元素及其下标
#### C++ 实现
在 C++ 中可以利用哈希表(`unordered_map`)来记录每个元素的出现次数以及它们对应的下标列表。以下是具体实现方法:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
std::unordered_map<int, std::vector<int>> findDuplicates(const std::vector<int>& nums) {
std::unordered_map<int, std::vector<int>> elementIndices;
for (int i = 0; i < nums.size(); ++i) {
elementIndices[nums[i]].push_back(i); // 将当前索引加入对应元素的列表中
}
std::unordered_map<int, std::vector<int>> duplicates;
for (const auto& pair : elementIndices) {
if (pair.second.size() > 1) { // 如果某个元素有多个索引,则它是重复项
duplicates[pair.first] = pair.second;
}
}
return duplicates;
}
void printDuplicates(const std::unordered_map<int, std::vector<int>>& duplicates) {
for (const auto& pair : duplicates) {
std::cout << "Element: " << pair.first << ", Indices: ";
for (auto index : pair.second) {
std::cout << index << " ";
}
std::cout << std::endl;
}
}
```
上述代码通过遍历整个向量并将其存储到一个映射结构中完成操作[^2]。
---
#### Python 实现
Python 提供了更简洁的方式处理此类问题,同样可以通过字典保存每个元素的所有位置信息:
```python
def find_duplicates(nums):
element_indices = {}
for idx, num in enumerate(nums):
if num not in element_indices:
element_indices[num] = []
element_indices[num].append(idx)
duplicates = {key: value for key, value in element_indices.items() if len(value) > 1}
return duplicates
nums = [4, 3, 6, 7, 3, 8, 4]
duplicates = find_duplicates(nums)
for elem, indices in duplicates.items():
print(f"Element: {elem}, Indices: {indices}")
```
此段脚本会输出所有具有两个及以上相同数值的位置集合[^3]。
---
#### Java 实现
对于 Java 而言,也可以采用类似的思路构建 HashMap 来追踪每一个整数首次遇见时所在位置以及其他后续匹配处:
```java
import java.util.*;
public class DuplicateFinder {
public static Map<Integer, List<Integer>> getDuplicateIndexes(List<Integer> list){
Map<Integer,List<Integer>> map=new HashMap<>();
int size=list.size();
for(int i=0;i<size;i++){
Integer currentNumber=list.get(i);
if(!map.containsKey(currentNumber)){
map.put(currentNumber,new ArrayList<>());
}
map.get(currentNumber).add(i);
}
Iterator<Map.Entry<Integer,List<Integer>>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<Integer,List<Integer>> entry=it.next();
if(entry.getValue().size()==1){
it.remove();
}
}
return map;
}
}
```
这里我们先填充好所有的键值对关系再移除那些只存在一次的数据条目[^5]。
---
### 总结
以上展示了不同语言环境下解决同一类问题的不同策略和技术手段。无论是哪种方式都离不开基本原理即借助额外空间辅助记忆已访问过的项目以便快速检索是否存在重复情况发生[^1].
阅读全文
相关推荐


















