如何快速找出一個數組中只出現一次的兩個數,其他元素出現兩次?保證時間複雜度O(n),空間複雜度O(1)
分析步驟:
1、對數組中所有元素求異或,得到結果result。那麼由於這個數組中有兩個數只出現一次,而其他元素出現兩次,所以result的結果一定不爲零
2、找出result中任意不爲零的位,保存位的下標,記作index
3、將數組分爲第index位爲零和不爲零兩組,分別對這兩組進行異或運算,即可得到數組中只出現一次的兩個數
java代碼如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
String[] str = input.nextLine().split(" ");
int[] arr = new int[str.length];
for (int i = 0; i < str.length; i++) {
arr[i] = Integer.parseInt(str[i]);
}
int result[] = getOnceElements(arr);
System.out.println(Arrays.toString(result));
}
}
public static int[] getOnceElements(int[] arr) {
//用於保存結果
int[] result = new int[2];
//1、先進行異或,得到數組中所有元素異或的結果
int res = arr[0];
for (int i = 1; i < arr.length; i++) {
res ^= arr[i];
}
//2、找到異或結果二進制表示中中不爲0的位
int index = 0;
for (int i = 0; i < 32; i++) {
if ((res >> i & 1) == 1) {
index = i;
break;
}
}
//3、將數組按第index位爲0和爲1,分爲兩組
for (int i = 0; i < arr.length; i++) {
if ((arr[i] >> index & 1) == 1) {
result[0] ^= arr[i];
} else {
result[1] ^= arr[i];
}
}
return result;
}
}
測試結果:
1 2 1 2 4 3 5 5
[3, 4]
3 4 5 6 3 4 7 8 5 6
[7, 8]