java - 在 O(log n) 时间内计算排序的 int 数组中具有相同数字的数字

标签 java arrays algorithm time-complexity big-o

我遇到一个面试问题,要求应聘者计算数组中具有相同数字的所有数字。 例如:

用 int input = 394 计算所有具有相同数字的数字 int[] arr = {1, 14, 101, 349, 439, 745, 934}

该函数将返回 3,因为 439、934、349 共享相同的数字。 问题是如何在 O(log n) 时间内解决这个问题?我对大 O 概念还是陌生的,除了 O(n) 和 O(n^2) 之外……我无法理解如何实现 O(log n)。

我的第一个想法是: 我会计算数组中所有元素的数字总和。如果总和相等,则它们包含与输入数字相同的数字。

      int counter = 0;

      while (num > 0) {
         int digitSum += num % 10;
         num = num / 10;
      }
      for(int i = 0; i < arr.length; i++) {
      int k = arr[i];

      while (k > 0) {
          int sumOfDigits += k % 10;
          k = k/10;
      }
      if(sumOfDigits == digitSum) {
       counter++;
      }
}

我知道这至少需要 O(n) 时间,但我找不到更好的解决方案。

最佳答案

最佳答案由 Andy Turner 和 JB Nizet 给出,但遗憾的是仅作为评论:

为此,我们必须假设:输入数字的大小是有界的,数组中的整数是不相交的,n 是数组中元素的数量。

  1. 计算输入数字的所有排列。如果数字有重复的数字,一些排列可能是相同的,只取一次。这需要 O(1) 时间,排列数也是 O(1)。
  2. 对于每个排列,使用二进制搜索在数组中查找相应的数字并计算所有命中数。这需要 O(log n)。

总的来说你得到了 O(log n) 的运行时间。

请注意,这仅在输入数字的界限相当低时才实用。如果输入数字可以说是 20 位数字,那么使用 O(n) 方法要好得多,除非 n 真的很大。

关于java - 在 O(log n) 时间内计算排序的 int 数组中具有相同数字的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508145/

相关文章:

java - JPQL 检查多对多关系

java - 引入struts2标签后表单未正确对齐

arrays - Swift:使用备用键的合并排序算法

php - 根据父 ID 值将数组从一维转换为多维

c++ - 文本文件中的 BellmanFord 未提供与手动输入相同的输出

php - 防止两个保留之间发生冲突的代码逻辑

java - 为什么 Java 中的 if 语句会发出错误,即使它始终为真?

java - 对于带有 netty 3.10.6 的套接字客户端,异常 : java. nio.channels.NotYetConnectedException

javascript - 数组中的对象

c++ - 调用迭代函数的次数