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

C++中查找数组相等值的方法及高效实现问询

在C++中查找数组重复值的方法与优化

嘿,咱们先从你的现有代码说起——首先得提个小bug:你内层循环里的自增变量写错啦!for(int k = i; k < arrayLenght; i ++)这里应该是k++,不然i会被内外层循环同时递增,逻辑完全乱掉。另外arrayLenght拼写也有误,应该是arrayLength。先给你修正后的基础双重循环版本:

for(int i = 0; i < arrayLength; i++) {
    // 从i+1开始,避免和自身对比、重复检查
    for(int k = i + 1; k < arrayLength; k++) {
        if(array[i] == array[k]) {
            char message[100];
            sprintf(message,"There is a duplicate of %s", array[i]);
            ShowMessage(message);
            break;
        }
    }
}

(如果你的数组不是字符串类型,记得调整sprintf的格式符哦)

当然,双重循环的时间复杂度是O(n²),当数组元素数量较多时会很慢,这里有两种更高效的优化方案:

方法一:排序后遍历检查

思路是先对数组排序(时间复杂度O(n log n)),排序后重复元素会相邻,之后只需一次遍历(O(n))就能找到重复项,整体时间复杂度远低于O(n²)。

代码示例(假设数组是std::string类型):

#include <algorithm>
#include <string>

std::string array[] = {"a", "b", "c", "a", "d"};
int arrayLength = sizeof(array) / sizeof(array[0]);

// 先排序,会改变原数组顺序,需要保留原数组的话先复制一份
std::sort(array, array + arrayLength);

// 遍历找相邻重复元素
for(int i = 1; i < arrayLength; i++) {
    if(array[i] == array[i-1]) {
        char message[100];
        sprintf(message,"There is a duplicate of %s", array[i].c_str());
        ShowMessage(message);
        // 找第一个重复就break,找所有重复就去掉break
        break;
    }
}

方法二:使用哈希表(std::unordered_set)

利用std::unordered_set不允许存储重复元素的特性,遍历数组时尝试插入元素:如果插入失败,说明该元素已经存在,也就是找到了重复值。平均时间复杂度是O(n),是效率最高的方案之一。

代码示例:

#include <unordered_set>
#include <string>

std::string array[] = {"a", "b", "c", "a", "d"};
int arrayLength = sizeof(array) / sizeof(array[0]);

std::unordered_set<std::string> seen;

for(int i = 0; i < arrayLength; i++) {
    // insert返回的pair中,second为false表示元素已存在
    if(!seen.insert(array[i]).second) {
        char message[100];
        sprintf(message,"There is a duplicate of %s", array[i].c_str());
        ShowMessage(message);
        break;
    }
}

这个方法不会改变原数组顺序,唯一的小代价是需要额外的存储空间(空间复杂度O(n)),但大多数情况下这个取舍是完全值得的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:40:53