C++ 在单个for循环中查找数组中的重复元素

C++ 在单个for循环中查找数组中的重复元素,c++,algorithm,C++,Algorithm,你好 假设给你一个数组[1,5,3,6,7,3,67,54] 其中每个元素只出现一次,除了一个元素在本例中为3。手头的任务是找到这个元素,并且只允许使用一个等于数组大小的for循环 附言: 您可能建议使用散列映射,但在这种情况下,在遍历数组结束后,您需要遍历散列映射,以找到哪个键的值为2,这使得循环为2,这是不允许的 你会怎么做?哈希映射可以解决你的问题。事实上,它比你需要的要多。使用无序的集合。遍历数组,如果集合中不存在值,则插入该值;否则,您已找到重复的值 --编辑-- 好吧,我们中的一个肯

你好 假设给你一个数组[1,5,3,6,7,3,67,54] 其中每个元素只出现一次,除了一个元素在本例中为3。手头的任务是找到这个元素,并且只允许使用一个等于数组大小的for循环

附言: 您可能建议使用散列映射,但在这种情况下,在遍历数组结束后,您需要遍历散列映射,以找到哪个键的值为2,这使得循环为2,这是不允许的


你会怎么做?

哈希映射可以解决你的问题。事实上,它比你需要的要多。使用无序的集合。遍历数组,如果集合中不存在值,则插入该值;否则,您已找到重复的值

--编辑--

好吧,我们中的一个肯定不理解另一个。根据我对您问题的理解,下面是使用集合的示例解决方案。如果你认为我仍然误解,那么请提供更多关于你的问题的细节

#include<vector>
#include<iostream>
#include<unordered_set>

bool repeating(const std::vector<int> &vec, int &repeatingValue)
{
    std::unordered_set<int> set;
    for(auto x: vec)
    {
        if(set.count(x))
        {
            repeatingValue = x;
            return true;
        }
        set.insert(x);
    }
    return false;
}

int main()
{
    std::vector<int> v{1,5,3,6,7,3,67,54};

    int repeatingValue;
    if(repeating(v, repeatingValue))
        std::cout<<repeatingValue<<std::endl;
    else
        std::cout<<"No repeating value detected!" << std::endl;

    return 0;
}
#包括
#包括
#包括
布尔重复(const std::vector&vec,int&repeatingValue)
{
std::无序_集;
用于(自动x:vec)
{
如果(设置计数(x))
{
重复值=x;
返回true;
}
套。插入(x);
}
返回false;
}
int main()
{
std::向量v{1,5,3,6,7,3,67,54};
int重复值;
if(重复(v,重复值))

std::coutShow告诉我们您到目前为止尝试了什么!为什么需要迭代哈希映射?@KostasRim排序至少与扫描数组一样昂贵,这使您的解决方案比2个循环更糟糕。顺便说一下,这看起来像是重复的:@chtz你好,先生,我在一次采访中被问到这个问题,我使用cpp的映射来存储数字计数但采访者说,这将使它成为两个循环…同样适用于使用sets@shourabh是否有任何空间限制?请阅读侧注,其中说明,如果您每次检查该值是否存在于集合中,则仅使用一个for循环。您正在使用另一个for循环遍历该集合set@shourabh您不需要遍历两次。只需检查是否存在一个值即可在插入集合之前,请告诉我如何检查值是否存在?通过遍历所有可能的集合元素,对吗?当然不是!哈希将键与索引关联。因此,检查意味着您只需转到索引并查看该值是否存在,这很可能是采访者正在查找的值,但取决于哈希表的实现方式,可能会出现错误处理碰撞的行动。