如果我们有一个所有数字的数组,最多N(N <10),找到所有缺失的数字的最佳方法是什么。 例如:
N = 5
1 5 3 2 3
Output: 1 5 4 2 3
在前者中,数字4是缺失的,有2个3,所以我们用4替换了第一个,现在数组已经完成 - 所有数字都达到了5个。
有没有简单的算法可以做到这一点?
答案 0 :(得分:2)
由于N非常小,如果数字i出现k次,则可以使用F [i] = k。
int F[10]; // make sure to initialize it to 0
for ( int i = 0; i < N; ++i )
++F[ numbers[i] ];
现在,要替换重复项,遍历您的数字数组,如果当前数字出现多次,则减少其计数并将其替换为出现0次的数字并增加该数字的计数。如果你保留一个根本没有出现的数字列表,你可以保留这个O(N)。我会告诉你究竟需要做什么,因为这听起来像是家庭作业。
答案 1 :(得分:1)
假设所有数字都在1≤x≤N范围内。
保留2个大小为N的数组output
,used
(作为关联数组)。将它们全部初始化为0。
从右侧进行扫描,将值填入output
,除非它是used
。
检查未使用的值,并按顺序将它们放入output
的空(零)插槽中。
O(N)时间复杂度,O(N)空间复杂度。
答案 2 :(得分:0)
您可以使用set data structure - 一个用于所有最多N的数字,一个用于您实际看到的数字,并使用一组差异。
答案 3 :(得分:0)
执行此操作的一种方法是按顺序查看数组中的每个元素,并查看之前是否已在已检查的元素中看到该元素。如果是这样,那么将该数字更改为您之前没有见过的数字,然后继续。
请允许我向您介绍我的朋友Schlemiel the Painter。发现更有效的方法对读者来说是一个挑战。
答案 4 :(得分:0)
这种看起来像是作业,如果不是,请告诉我们。我会给你一个小提示,如果你确认这不是作业,我会改进我的答案。
我现在的提示是这样的:如果你是手工做,你会怎么做?你会写出一些额外的数字列表吗?你会读一下这个列表(多少次?)?等
对于简单问题,有时在直观的手工方法之后对算法进行建模可以很好地工作。
答案 5 :(得分:0)
以下是我今天阅读的链接,可能会有所帮助。 http://research.swtch.com/2008/03/using-uninitialized-memory-for-fun-and.html