此方法不可取,因为它存在溢出问题。所以用方法找到两个数字,这是高性能的。如果你有兴趣,我可以解释。integer
XOR
根据下面@ordinary的请求,我正在解释算法:
编辑
假设数组的最大元素是 假设 和 这里 并且不存在于 a[] 中,因此 max 元素是 。a[]
B
a[]={1,2,4}
3
5
B=5
-
xor
数组的所有元素a
X
-
xor
从 1 到 到 的所有元素B
x
- 查找最左边最位集
x
x = x &(~(x-1));
- 现在,如果比其他人用
a[i] ^ x == x
xor
a[i]
p
xor
q
- 现在对于所有从 1 到如果比与其他与
k
B
k ^ x == x
xor
p
xor
q
- 现在打印和
p
q
证明:
设 和 是 5,即从 1 到 5,缺失的数字是 3 和 5a = {1,2,4}
B
一旦我们元素和从1到5的数字,我们就留下了3和5,即。XOR
a
XOR
x
现在,当我们发现它的最左边的位集只不过是3和5之间最左边最不同的位。(以及其中x
3--> 011
5 --> 101
x = 010
x = 3 ^ 5
)
在此之后,我们尝试根据位集分为两组,因此两组将是:x
p = 2 , 2 , 3 (all has the 2nd last bit set)
q = 1, 1, 4, 4, 5 (all has the 2nd last bit unset)
如果我们是它们之间的元素,我们会发现,同样,如果我们所有的元素都在它们之间,那么我们将得到5。答案由此而来。XOR
p
3
xor
q
Java 中的代码
public void findNumbers(int[] a, int B){
int x=0;
for(int i=0; i<a.length;i++){
x=x^a[i];
}
for(int i=1;i<=B;i++){
x=x^i;
}
x = x &(~(x-1));
int p=0, q=0;
for(int i=0;i<a.length;i++){
if((a[i] & x) == x){
p=p^a[i];
}
else{
q=q^a[i];
}
}
for(int i=1;i<=B;i++){
if((i & x) == x){
p=p^i;
}
else{
q=q^i;
}
}
System.out.println("p: "+p+" : "+q);
}