在未排序的数组 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)[重复]的主要内容,如果未能解决你的问题,请参考以下文章