You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用Set查找数组重复元素的代码优化问题咨询

代码问题梳理
  • 核心判断逻辑完全颠倒:setInt.find(integers[i]) != setInt.end()的含义是当前元素已经在Set中存在,原代码此时反而执行插入操作,不存在时才判定为重复,逻辑完全错误
  • 注释内容与逻辑不符:注释写明“如果该数字不在set中,说明它不是重复元素”,但对应判断条件完全写反
  • 会重复输出同一重复值:如果某个元素出现3次及以上,会重复多次输出该元素是重复值
  • 插入语句写法冗余:setInt.insert({integers[i]})不需要额外加花括号,直接传入数值即可
  • 输出格式不规范:多个重复值输出时无分隔、无换行,可读性差
  • 性能可优化:std::set底层是红黑树,查找插入时间复杂度为O(logn),换成std::unordered_set可达到平均O(1)的时间复杂度,效率更高
改进方案

修正逻辑、优化输出与性能后的代码如下:

#include <iostream>
#include <unordered_set>
using namespace std;

void FindDuplicate(int integers[], int n){
  unordered_set<int> existed;
  unordered_set<int> duplicated; // 存储已输出的重复值,避免重复打印

  for(int i = 0; i < n; i++){
    // 元素已存在于已出现集合,判定为重复
    if(existed.count(integers[i])){
      // 仅当该重复值未输出过时打印
      if(!duplicated.count(integers[i])){
        cout << integers[i] << " 是重复元素" << endl;
        duplicated.insert(integers[i]);
      }
    } else {
      // 首次出现的元素存入已出现集合
      existed.insert(integers[i]);
    }
  }
}

int main() {
  int integers [] = {1,2,2,3,3,3,4};
  int n = sizeof(integers)/sizeof(integers[0]);
  FindDuplicate(integers, n);
  return 0;
}

上述代码运行后会输出:

2 是重复元素
3 是重复元素

符合需求,且时间复杂度为O(n),优于双层for循环的O(n²)方案。

内容的提问来源于stack exchange,提问作者Ope Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:24:02