在未排序的数组 1 到 100 中查找 2 个缺失的数字。(Java)[重复]

Posted

技术标签:

【中文标题】在未排序的数组 1 到 100 中查找 2 个缺失的数字。(Java)[重复]【英文标题】:Find 2 missing numbers in an unsorted array 1 to 100. (Java) [duplicate] 【发布时间】:2016-12-14 16:22:27 【问题描述】:

我正在努力解决以下提示背后的逻辑:一个未排序的整数数组包含从 1 到 100 的 98 个不同数字。因此,在从 1 到 100 的数字中,缺少两个不同的数字。找到他们。

我理解寻找一个缺失数字背后的概念,它是第二个给我带来问题的数字。有什么建议吗?

是的,我看过这个entry,但我发现给出的答案要么过于复杂、过于详细,要么离题。我是一名 Java 初学者 - 只是想解决这个问题。

编辑:这是我在下面用数字 1-100 初始化一个数组然后对它们进行排序的地方:

for (int i = 0; i  < arr.length; i++) 
        int j = i + 1;           
          if (arr[j] - arr[i] > 1)
              int missing = arr[i + 1];  
              System.out.println(missing);
                                    
    

我现在的问题是我无法让循​​环打印实际丢失的数字。它在丢失的数字上方打印数字。我尝试了几种不同的方法,它总是打印上面或下面的数字,而不是实际丢失的数字。

【问题讨论】:

您能否发布您迄今为止所尝试的内容,以便我们可以尝试找到混乱的根源? 同时使用 Sum (Euler) 和 Product (Factorial) 您将需要 BigInteger。这将为您提供 O(N) 时间和 O(1) 存储空间。 发帖前你至少用谷歌搜索过吗? 如果我没有就不会发布。 @pm77 精确乘积,即 n!,至少为 O(n ^ 1.5) 【参考方案1】:

排序数组,然后循环,如果循环中的下一个元素不是previous+1,那么它缺少一个。将先前的值保存到单独的变量中,以便一个接一个地获得更多不同的数字。

【讨论】:

您注意到未排序了吗? 你注意到他的前两个字:“排序数组”吗? @PM77-1,是的 - 因此是“排序数组”。 未排序并不意味着 - 无法排序。 @MaciejSikora 我问是因为如果你通过简单的检查对数组进行简单循环,那么如果你有,例如,缺少 3 和 4,你会得到 1 和 2,然后是 5。 5 不是 2+1,所以它会注意到缺少 3。但是,如果您只是在下一个元素(即 5)处继续循环,它将永远找不到另一个丢失的数字。如果缺少 1,则必须在循环之前检查它,否则它将被错过。【参考方案2】:

创建一个包含 100 个条目的“列表”;每个值在启动时设置为false

迭代您的数组,只需将每个条目作为该布尔值列表中的索引 - 并将那里的值切换为 true

最后,布尔列表包含两个值false;它们的索引构成了两个缺失的数字。

【讨论】:

使用array 比使用List 更好,但你仍然有我的支持。 这是为什么呢?我是说;为什么你更喜欢数组?因为初始分配有固定的大小?并感谢您的支持;我真的很困惑为什么另一个问题得到了支持。我在发布答案后 2 秒投了反对票。 我更喜欢数组,因为索引到它需要恒定的时间,而不是与列表长度成正比的时间,并且没有缺点,因为数组/列表将始终是固定大小。跨度> @nhouser9 谁告诉你的? ArrayList 索引访问具有 O(1) [***.com/questions/26638207/…] 那是因为 ArrayList 是在后台使用可以动态增长的数组实现的。这不是一个真实的清单。至于“谁告诉我的”,我是在大学六年的时候学会的。有关访问各种数据结构中的元素的时间复杂度,请参见此图:image.slidesharecdn.com/…【参考方案3】:

假设您的未排序 int 数组称为 arr。现在创建一个包含 100 个元素的布尔数组,全部初始化为 false(默认值)。当您遍历arr 时,将布尔数组中的相应元素标记为true。例如,如果arr 中的第一个元素是 20,则使 visited[19] 为真。完成此操作后,遍历布尔数组以查看哪两个索引是错误的,这将告诉您缺少哪两个数字。它应该是这样的,

boolean visited = new boolean[100];
for(int i = 0; i < arr.length; i++)
    visited[arr[i] - 1] = true;

for(int i = 0; i < visited.length; i++)
    if(!visited[i])
         System.out.println(i + 1);
    

【讨论】:

错误答案。解决方案是 O(N) 时间和 O(1) 内存。查看标记的重复主题。 @xenteros 答案没有错。也许它不是最优的。但它给出了预期的输出。而且这个问题本身并没有对时间和内存Os施加任何限制。 这是一个流行的问题。如果我问你关于排序的问题,你会给我 log(n^2) 的解决方案吗? @xenteros 正如 GhostCast 指出的那样,OP 从未明确表示大 O 是这里的一个因素。但是,我确实明白你的意思,我的回答并不是最有效的记忆方式。 @xen 重要的是,它不需要排序,而且 O(n) 时间是最快的。唯一的缺点是 O(n) 空间复杂度,但它可以快速处理更大的数字范围

以上是关于在未排序的数组 1 到 100 中查找 2 个缺失的数字。(Java)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在数字数组中查找缺失数字的最快方法

在未排序的数组中找到第 k 个最大的元素

用于在未排序数组中查找最大元素的 Java util 函数

LeetCode.215-数组中的第K个最大元素

面试题:寻找缺失的整数

如何在数组中找到两个缺失值? [复制]