数组独特元素和移动应用数据结构

时间:2017-12-06 06:39:01

标签: java arrays sorting collections time-complexity

最近在面试中提出了以下问题

  1. 您将获得一个整数数组,其中所有元素重复两次,但只有一个元素只出现一次,您需要找到具有O(nlogn)时间复杂度的唯一元素。假设数组是{2,47,2,36,3,47,36},输出应该是3。我告诉我们可以执行合并排序(因为它需要(nlogn))之后我们可以检查下一个元素,但他说它将需要O(nlogn)+ O(n)。我还告诉我们可以使用HashMap来保持元素数量,但他再次说不,因为我们必须再次遍历hashmap以获得结果。经过一些研究,我发现使用xor运算会给出O(n)的输出。除了排序之外还有其他更好的解决方案可以在O(nlogn)时间内给出答案吗?
  2. 当我们使用智能手机时,我们可以同时打开许多应用。当我们查看目前所有应用程序都处于打开状态时,我们会看到最近打开的应用程序位于前面的列表,我们可以从列表中的任何位置删除或关闭应用程序。 Java中有一些Collection可以非常有效地执行所有这些任务。我告诉过我们可以使用LinkedList或LinkedHashMap,但他并不相信。什么是最好的收藏品?

1 个答案:

答案 0 :(得分:1)

  1. 首先,如果面试官使用Big-O表示法并期望O(n log n)解决方案,那么您的答案没有错。我们知道O(x + y) = O(max(x, y))。因此,虽然您的算法为O(n log n + n),但如果我们只调用O(n log n),则可以。但是,可以使用二进制搜索在O(log n)中找到在排序数组中出现一次的元素。作为提示,在执行搜索时利用奇数和偶数索引。此外,如果面试官期望O(n log n)解决方案,那么对于遍历的反对是荒谬的。哈希映射解决方案已经O(n),如果存在问题,则需要额外的空间。因此,最好的方法是使用正如您所提到的XOR。还有一些O(n)解决方案,但它们并不比XOR解决方案更好。
  2. 对我而言,LinkedList也适用于此任务。我们想要从任何位置删除,也想使用一些堆栈操作(push,pop,peek)。可以从LinkedList
  3. 构建自定义堆栈