可能是重复:
简单的面试题变难了:给出数字 1..100,找到缺失的数字
在线性时间和恒定空间内查找数组中缺失和重复的元素
我在一个论坛上看到了一个有趣的问题。
你有 100 个数字,从 1 到 100,但不小心有一个数字重复了。 例如 1,99,3,...,99,100 数组不是按排序格式排列的,如何找到重复的数字?
我知道哈希可以在 O(n) 时间内解决,但需要 O(n) 空间。我需要 O(1) 空间。
可能是重复:
简单的面试题变难了:给出数字 1..100,找到缺失的数字
在线性时间和恒定空间内查找数组中缺失和重复的元素
我在一个论坛上看到了一个有趣的问题。
你有 100 个数字,从 1 到 100,但不小心有一个数字重复了。 例如 1,99,3,...,99,100 数组不是按排序格式排列的,如何找到重复的数字?
我知道哈希可以在 O(n) 时间内解决,但需要 O(n) 空间。我需要 O(1) 空间。
计算两个和:sum和square sum。
以你的示例为例:
sum = 1+99+3...+100
sq_sum = 1^2+99^2+3^2+...+100^2
假设序列中用 y 替换了 x。sum = n(n+1)/2 -y+x.
sq_sum = n(n+1)(2n+1)/6 -x^2 +y^2
现在,求解x和y。
常数空间和O(n)时间。
从方程式中:
x = sum - n(n+1)/2 +y
将这个代入第二个方程:
sq_sum = n(n+1)(2n+1)/6 -(sum - n(n+1)/2 +y)^2 +y^2
注意y^2被消除了,你只剩下一个只有一个未知数y的线性方程。解决它!sum
和sq_sum
所需的空间取决于输入大小,即不是恒定空间。 - Justin Bellm
是缺失的数字,r
是重复的数字。经过数组一次,设X
是对数组条目和索引1
到n
进行异或处理的结果。那么X = m XOR r
。特别地,它不是0
。让b
是X
中任何非零位(您只需要选择一个,因为X
不是0
)。通过数组时,让Y
是对数组条目和索引1
到n
进行异或处理的结果,在其中位b
为0
,并且让Z
是对数组条目和索引1
到n
进行异或处理的结果,在其中位b
为1
。然后,Y
和Z
分别保存m
和r
,所以唯一剩下的就是进行最后一次遍历,以确定它们是否在数组中。X
用于b
,则为3)。Y
和Z
,则为3)。O(1)
,时间复杂度为O(n)
。我们可以用O(n)的时间复杂度和常量空间来完成:
index = Math.abs(a[i]) - 1
index
处的值
index+1
)作为答案,因为这意味着我们之前已经看到了这个索引。""
static int findDup(int[] a){
for(int i=0;i<a.length;i++){
int index = Math.abs(a[i]) - 1;
if(a[index] < 0)
return index+1;
else
a[index] = -1 * a[index];
}
return -1;
}
a[index] = -1 * a[index];
覆盖了输入。这就是为什么人们说这个解决方案不是常数空间的原因。 - PengOne计算所有整数的总和 计算 int p = sum % 100 100 - p 就是答案