可能重复:
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;
数组[0]和数组[1]的位置是什么?
如果问题只是将一个位置归零,那么问题就很容易了。你可以得到1到8之间的数字之和,它是36,并且当你在一个位置为零之后将数组中的所有数字相加时,它会从你得到的总和中减去它。
这不是作业问题。但我想我记得在大学时被问过这个问题。
答案 0 :(得分:4)
您可以使用常量内存和1个数组查找来解决您的问题:
现在你有2个方程的系统,有2个变量(x + y == sum1和x * x + y * y == sum2),可以很容易地解决。
答案 1 :(得分:2)
我认为这应该有效,并且比搜索每个数字更有效:
- 所有的数字
- 设置二到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,因此这是缺少的两个数字。
答案 2 :(得分:2)
您可以创建一个数字从1到10000的集合,遍历数组并从集合中删除您在数组中遇到的每个数字。在数组的末尾,您的集合应该有两个被删除的数字。
答案 3 :(得分:1)
您无法知道阵列特定位置的归零数字是什么,但您可以通过找到丢失的nos来了解这两个数字。在你的号码。集。