将大小为 10000 的数组中的 2 个位置清零,填充从 1 到 10000 的整数。如何找出这些值是啥? [复制]
Posted
技术标签:
【中文标题】将大小为 10000 的数组中的 2 个位置清零,填充从 1 到 10000 的整数。如何找出这些值是啥? [复制]【英文标题】: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 是的。谢谢,我在发帖前尝试过搜索,但找不到。 【参考方案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 个数组查找来解决您的问题:
-
您可以找到归零数字的总和 - 通过计算所有数字的总和减去剩余数字的总和
您可以通过类似的方法找到归零数字的平方和(仅注意选择可以容纳足够大值的数字类型)。
现在您有 2 个方程组,其中包含 2 个变量(x+y==sum1 和 x*x+y*y == sum2),可以轻松求解。
【讨论】:
这很好用,谢谢!这是我一直在寻找的。正如@jonderry 提到的,解决方案也可以在这里找到***.com/questions/3492302/…以上是关于将大小为 10000 的数组中的 2 个位置清零,填充从 1 到 10000 的整数。如何找出这些值是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章