在一个大小为10000的数组中,用1到10000的整数填充2个位置.你是如何发现这些价值观的



可能重复:
简单的面试问题变得更难了:给定数字1.100,找到缺失的数字

如果您有一个大小为10000的数组,其中填充了从1到10000的整数,则没有重复,并且您将该数组中的两个位置设置为0。你是怎么算出那两个数字的?

例如:数组={8,6,3,5,4,2,7,1}//数组中填充了从1到8的数字,只是为了简单起见。

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

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

如果这个问题只有一个零的位置,那么这个问题就很容易了。你可以取从1到8的数字之和,即36,然后从一个位置为零后将数组中的所有数字相加得到的和中减去它。

这不是家庭作业问题。但我想我记得在大学里被问到这个问题。

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

  1. 你可以通过计算所有数字的总和减去剩余数字的总和来找到零的数字的总和
  2. 类似的方法,你可以找到零数字的平方和(只需小心选择可以容纳足够大值的数字类型)

现在你有了一个由2个变量组成的方程组(x+y==sum1和x*x+y*y==sum2),可以很容易地求解。

我认为这应该有效,而且比搜索每个数字要高效得多:
-对所有数字求和
-将2设置为0
-查找新的总和
-找出差异的所有因素
-根据数组中仍然存在的数字,查看哪组因子是可能的,因为没有重复

例如:
数组={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都不在数组中,因此这是丢失的两个数字。

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

您不知道数组的特定位置中被归零的数字是什么,但您可以通过在编号集中查找丢失的编号来知道这2个数字。

最新更新