【问题标题】:Arrays unique element and Mobile apps data structure数组唯一元素和移动应用数据结构
【发布时间】:2018-05-19 23:32:18
【问题描述】:

最近在一次采访中被问到了以下问题

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

【问题讨论】:

    标签: java arrays sorting collections time-complexity


    【解决方案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 构建自定义堆栈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2018-06-10
      • 2022-11-18
      • 2014-09-14
      • 2020-04-14
      • 2013-10-11
      相关资源
      最近更新 更多