2017-07-16 50 views
-3

那么你好那里 假设你给了一个数组[1,5,3,6,7,3,67,54] 其中每个元素只出现一次一个元素在这种情况下是3。目前的任务是找到这个元素,并且允许您只使用一个for循环,该循环等于数组的大小。在单个for循环中查找数组中的重复元素

PS: 你可能会建议使用哈希映射,但在这种情况下,在遍历数组结束后,你需要遍历哈希映射来找出哪个键的值为2,这使得2 for循环,而不是允许。

你会怎么做?

+4

向我们展示您到目前为止所尝试的!为什么你需要遍历哈希映射? – chtz

+1

@KostasRim排序至少与扫描数组一样昂贵,这使得您的解决方案比2个循环更糟糕。 –

+0

顺便说一句,这看起来像一个重复:https://stackoverflow.com/q/44637670/1632887 – seleciii44

回答

4

哈希图可以解决您的问题。实际上,它超过了你的需要。使用unordered_set。遍历数组,如果set中不存在一个值,则插入它;否则你已经找到了你的重复值。

- 编辑 -

好了,我们的人不理解对方,这是肯定的。根据我对你的问题的理解,下面是使用一个集合的示例解决方案。如果您认为我仍然误解,请提供有关您的问题的更多详细信息。

#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; 
} 
+0

请阅读旁注,它说只使用一个循环 如果你检查每个值是否出现在你正在使用另一个循环遍历集合 – shourabh

+0

@shourabh你不需要遍历两次。只需在插入之前检查一个值是否存在于该集合中。 – seleciii44

+0

告诉我你是如何检查价值是否存在?通过遍历所有可能的设置元素? – shourabh