如何快速找出一個數組中只出現一次的兩個數,其他元素出現兩次?保證時間複雜度O(n),空間複雜度O(1)

如何快速找出一個數組中只出現一次的兩個數,其他元素出現兩次?保證時間複雜度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]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章