【发布时间】:2014-03-26 19:18:46
【问题描述】:
我在一次采访中遇到了这个问题,很想知道它会如何实施。
给定一个从 0 到 x 的未排序整数数组。一个号码丢失,一个号码重复。找出那些数字。
这是我想出的:
int counts[x+1];
for(int i =0;i<=x; i++){
counts[a[i]]++;
if(counts[a[i]] == 2)
cout<<”Duplicate element: “<<a[i]; //I realized I could find this here
}
for(int j=0; j<=x; j++){
if(counts[j] == 0)
cout<<”Missing element: “<<j;
//if(counts[j] == 2)
// cout<<”Duplicate element: “<<j; //No longer needed here.
}
我最初的解决方案是创建另一个大小为 x+1 的数组,循环遍历给定的数组并在给定数组的值处索引到我的数组并递增。如果在增量之后我的数组中的任何值都是 2,那就是重复的。但是,我不得不再次循环遍历我的数组,以找到缺失数字为 0 的任何值。
我指出这可能不是最省时的解决方案,但当我被问到时,我不确定如何加快速度。我意识到我可以将查找副本移到第一个循环中,但这对丢失的数字没有帮助。在胡扯了一会儿之后,面试官终于给了我一个想法,即哈希将是一个更好/更快的解决方案。我没有太多使用哈希,所以我不确定如何实现它。有人可以启发我吗?另外,请随时指出我的代码中的任何其他明显错误...提前致谢!
【问题讨论】:
-
是否允许对数组进行排序很重要?
-
@VladfromMoscow 面试官没有明确禁止对数组进行排序。然而,唯一被问到的是找到重复和缺失的号码。我只是在寻找一种能够以尽可能高效的方式产生这两个值的解决方案,因此没有想到对数组进行排序,因为排序通常是 O(nlogn) 时间,而我的解决方案实际上是 O(2n)。此外,以下 Scott Hunter 的解决方案找到了 O(n) 时间。
-
哈希在这种情况下没有帮助。我发布了一个解释原因的答案。