我最近在某个地方遇到了一个问题:
假设您有一个包含1001个整数的数组。这些整数的顺序是随机的,但您知道每个整数都在1到1000 (包括1和1000)之间。此外,每个数字在数组中只出现一次,但有一个数字出现两次。假设您只能访问数组的每个元素一次。描述一种查找重复数的算法。如果你在你的算法中使用了辅助存储,你能找到一个不需要它的算法吗?
我感兴趣的是second part,即不使用辅助存储的。你有什么想法吗?
发布于 2010-04-09 15:38:23
只需将它们相加,然后减去如果只使用1001个数字时所期望的总数。
例如:
Input: 1,2,3,2,4 => 12
Expected: 1,2,3,4 => 10
Input - Expected => 2
发布于 2010-04-09 17:06:57
Franci Penov的解决方案的非破坏性版本。
这可以通过使用XOR
运算符来完成。
假设我们有一个大小为5
的数组:4, 3, 1, 2, 2
这些是在指数:* 0, 1, 2, 3, 4
现在对所有元素和所有索引执行XOR
。我们得到2
,它是重复的元素。这是因为,0
在XORing中不起任何作用。剩余的n-1
索引与数组中相同的n-1
元素配对,数组中唯一未配对的元素将是副本。
int i;
int dupe = 0;
for(i = 0; i < N; i++) {
dupe = dupe ^ arr[i] ^ i;
}
// dupe has the duplicate.
这种解决方案的最大特点是它不会出现基于加法的解决方案中出现的溢出问题。
由于这是一个面试问题,最好从基于加法的解决方案开始,确定溢出限制,然后给出基于XOR
的解决方案:)
这使用了一个额外的变量,因此不能完全满足问题中的要求。
发布于 2010-04-09 15:38:39
把所有的数字加在一起。最终的总和将是1+2+...+1000+duplicate数字。
https://stackoverflow.com/questions/2605766
复制相似问题