假设我有一个包含999个单元格的数组,其中包含1-1000之外的所有数字,除了一个数字。找到这个数字最有效的方法是什么?我找不到比O(n平方)更好的方法。面试官告诉我有更好的方法。我该怎么办?
数组未排序。
答案 0 :(得分:13)
1-1000中所有数字的总和是已知值。计算数组中数字的总和,然后减去两者,给出差异。
We know that the sum of from 1..n is n(n+1)/2
。这是数学中相当普遍的结果,但如果你不熟悉它,你可以自己推导出它。
所以,你只需要对数组中的数字求和,然后从上面的值中减去该值,你就会知道缺少什么。
在代码中,这将是:
int findMissing(int [] inputArray) {
//In the above scenario, inputArray.size() would be 999
int range = inputArray.size() + 1; //so, range is 1000
int expected = range * (range + 1) * 0.5; //we expect the sum to be 500,500
int sum = 0;
for (int x: inputArray) {
sum += x;
}
//the missing number is the difference between what we expected, and what we found
return expected - sum;
这将是O(n)结果。
答案 1 :(得分:3)
就像那样:
int sum = (1000 * 1001) / 2; // sum of the n first integers is: n*(n+1)/2
for(int i : array) {
sum -= i;
}
return sum;
答案 2 :(得分:2)
你可以使用求和, http://betterexplained.com/articles/techniques-for-adding-the-numbers-1-to-100/ 然后从求和中减去所有单元格的总和。
missingDigit = (Summation - totalFromCells);