那么你好那里 假设你给了一个数组[1,5,3,6,7,3,67,54] 其中每个元素只出现一次一个元素在这种情况下是3。目前的任务是找到这个元素,并且允许您只使用一个for循环,该循环等于数组的大小。在单个for循环中查找数组中的重复元素
PS: 你可能会建议使用哈希映射,但在这种情况下,在遍历数组结束后,你需要遍历哈希映射来找出哪个键的值为2,这使得2 for循环,而不是允许。
你会怎么做?
那么你好那里 假设你给了一个数组[1,5,3,6,7,3,67,54] 其中每个元素只出现一次一个元素在这种情况下是3。目前的任务是找到这个元素,并且允许您只使用一个for循环,该循环等于数组的大小。在单个for循环中查找数组中的重复元素
PS: 你可能会建议使用哈希映射,但在这种情况下,在遍历数组结束后,你需要遍历哈希映射来找出哪个键的值为2,这使得2 for循环,而不是允许。
你会怎么做?
哈希图可以解决您的问题。实际上,它超过了你的需要。使用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;
}
请阅读旁注,它说只使用一个循环 如果你检查每个值是否出现在你正在使用另一个循环遍历集合 – shourabh
@shourabh你不需要遍历两次。只需在插入之前检查一个值是否存在于该集合中。 – seleciii44
告诉我你是如何检查价值是否存在?通过遍历所有可能的设置元素? – shourabh
向我们展示您到目前为止所尝试的!为什么你需要遍历哈希映射? – chtz
@KostasRim排序至少与扫描数组一样昂贵,这使得您的解决方案比2个循环更糟糕。 –
顺便说一句,这看起来像一个重复:https://stackoverflow.com/q/44637670/1632887 – seleciii44