【问题标题】:Zero out 2 locations in an array of size 10000, filled with integers from 1 to 10000. How do you find out what those values were? [duplicate]将大小为 10000 的数组中的 2 个位置清零,填充从 1 到 10000 的整数。如何找出这些值是什么? [复制]
【发布时间】:2011-09-25 10:41:59
【问题描述】:

可能重复:
Easy interview question got harder: given numbers 1..100, find the missing number(s)

如果您有一个大小为 10000 的数组,其中填充了从 1 到 10000 的整数,没有重复,并且您将该数组中的两个位置设置为 0。您如何确定这两个数字是什么?

例如: Array = {8,6,3,5,4,2,7,1};//为简单起见,用 1 到 8 的数字填充数组。

数组[0]=0; 数组[1]=0;

位置 Array[0] 和 Array[1] 是什么?

如果问题只有一个位置归零,那么问题就很简单了。您将从 1 到 8 的数字的总和(即 36)减去在将位置归零后将数组中的所有数字相加时得到的总和。

这不是作业问题。但我想我记得在大学时被问过这个问题。

【问题讨论】:

  • 您有时间限制吗?这个问题在 O(n lg n) 时间或 O(n) 时间内用 O(n) 额外内存解决是微不足道的。
  • @Jonderry 是的。谢谢,我在发帖前尝试过搜索,但找不到。

标签: algorithm


【解决方案1】:

我认为这应该有效,并且比搜索每个数字更有效:
- 将所有数字相加
- 将两个设置为 0
- 找到新的总和
-找出差异的所有因素
- 根据数组中仍然存在的数字,查看哪些因素是可能的,因为没有重复..

例如:
Array = {8,6,3,5,4,2,7,1};//为简单起见,用 1 到 8 的数字填充数组。
数组[0]=0;
数组[1]=0;

原始总和 = 36
新总和 = 28
差异 = 8
总和为 8 的对:7/1、6/2、5/3、4/4
检查 6/2,看到 6 和 2 都还在,排除那对。继续,直到找到两个数字都不在数组中的对。这就是你的答案。在这种情况下,数组中既没有 7 也没有 1,因此这是丢失的两个数字。

【讨论】:

  • 这些不是 (fortunately) 因素。
  • 是的,我知道.. 我在底部将其更改为 Pairs,但忘记在上方更改。
  • 这也可以,但我认为它比@Vladimir 的效率低。使用这种方法,您必须搜索数组 4 次。使用 Vladimir's,您必须遍历它一次才能获得总和。您还必须确定所有加起来产生差异的对。对于像 5000 这样可能需要大量工作的数字。
  • 我同意,我没有想到他的解决方案。很棒。
【解决方案2】:

您无法知道数组特定位置的归零数字是什么,但您可以通过查找丢失的数字来知道这 2 个数字。在你的没有。设置。

【讨论】:

  • 是的,我就是这个意思。位置无关紧要,我只是想要缺少的数字。
【解决方案3】:

您可以创建一个包含从 1 到 10000 的数字的集合,遍历数组并从集合中删除您在数组中遇到的每个数字。在数组的末尾,您的集合应该有两个被删除的数字。

【讨论】:

    【解决方案4】:

    您可以通过常量内存和 1 个数组查找来解决您的问题:

    1. 您可以找到归零数字的总和 - 通过计算所有数字的总和减去剩余数字的总和
    2. 您可以通过类似的方法找到归零数字的平方和(仅注意选择可以容纳足够大值的数字类型)。

    现在您有 2 个方程组,其中包含 2 个变量(x+y==sum1 和 x*x+y*y == sum2),可以轻松求解。

    【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2020-02-09
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多