这是我和我的朋友写的算法(在stackoverflow网站上)
这个算法只会找到第一个重复的数字并返回它。这可以在O(n)
中使用
我想完成这个算法,帮助我重复输入重复的数字。认为我有[1,1,3,0,5,1,5]
我希望此算法返回2
个重复的数字,1 and 5
的重复次数分别为3 and 2
。我可以用O(n)
做什么?
1 Algorithm Duplicate(arr[1:n],n)
2
3 {
4 Set s = new HashSet();i:=0;
5 while i<a.size() do
6 {
7 if(!s.add(a[i)) then
8 {
9 return a[i]; //this is a duplicate value!
10 break;
11 }
12 i++;
13 }
14 }
答案 0 :(得分:1)
您可以在Java中执行此操作:
List<Integer> num=Arrays.asList(1,1,1,2,3,3,4,5,5,5);
Map<Integer,Integer> countNum=new HashMap<Integer, Integer>();
for(int n:num)
{
Integer nu;
if((nu=countNum.get(n))==null)
{
countNum.put(n,1);
continue;
}
countNum.put(n,nu+1);
}
不是每次都要迭代以获得重复次数,而是最好将计数存储在地图中。
答案 1 :(得分:0)
答案 2 :(得分:0)
在这个特定的例子中,它不是关于算法,而是关于数据结构:Multiset
就像Set
,除了它不存储唯一的项目,而是存储一个每个项目在Multiset
中的频率计数。基本上,Set
会告诉您特定项目是否在Set
中,Multiset
此外还会告诉您多久一次该特定项目位于Multiset
。
因此,基本上您所要做的就是从Multiset
构建Array
。这是Ruby中的一个例子:
require 'multiset'
print Multiset[1,1,3,0,5,1,5]
是的,这就是它的全部。这打印:
#3 1
#1 3
#1 0
#2 5
如果您只想要实际重复,只需delete
计数小于2
的项目:
print Multiset[1,1,3,0,5,1,5].delete_with {|item, count| count < 2 }
只打印
#1 3
#2 5
正如@suihock提到的那样,你也可以使用Map
,这基本上只意味着代替Multiset
处理元素计数,你必须自己做:
m = [1,1,3,0,5,1,5].reduce(Hash.new(0)) {|map, item| map.tap { map[item] += 1 }}
print m
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }
同样,如果您只想要重复项:
print m.select {|item, count| count > 1 }
# { 1 => 3, 5 => 2 }
但是如果不是自己计算,你可以使用Enumerable#group_by
自己对元素进行分组,然后将分组映射到它们的大小。最后,转换回Hash
:
print Hash[[1,1,3,0,5,1,5].group_by(&->x{x}).map {|n, ns| [n, ns.size] }]
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }
所有这些都具有Θ(n)的摊销的最坏情况步骤复杂度。