有2n+1个数,其中2n个数两两成对,1个数落单,找出这个数。要求O(n)的时间复杂度,O(1)的空间复杂度。进阶问题:如果有2n+2个数,其中有2个数落单,该怎么办?
针对1个数落单情况,代码如下:
public class Solution {如果有两个数落单,那么上述算法操作的最终结果就是落单的两个数的异或结果,假设m=a^b,m中如果第k位二进制位上为1,那么说明a和b在相应位置上不同,那么根据这个位置将2n+2个数分为两组,每组分别使用上述算法就可以得到最终结果。
/**
*@param A : an integer array
*return : a integer
*/
public int singleNumber(int[] A) {
if (A.length == 0) {
return 0;
}
int n = A[0];
for(int i = 1; i < A.length; i++) {
n = n ^ A[i];
}
return n;
}
}