説明:
二つの数字(互いに異なる)の整数の配列に加えて、他の数値は2回表示されます。これら二つの図が表示されるだけで検索するプログラムを作成してください。必要とされる時間複雑度は、O(N)であり、空間的複雑さはO(1)です。
入力:
最初のライン:配列の長さN(1 <N <100000)
第二行:Nの整数、スペースで区切ら
輸出
これら二つの数字、大きな前後の小さい方は、スペースで区切って一度のみ登場
サンプル入力
10
5 5 6 7 9 9 7 3 3 2
サンプル出力
2 6
私のコード
import java.util.Scanner;
public class Exam07_TwoSingleNumbers {
/**
* @param args
*/
public static void main(String[] args) {
//空间复杂度O(1)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n];
int x1=0;
for (int i = 0; i < n; i++) {
a[i]=sc.nextInt();
//任何数异或0都等于它本身
x1 ^= a[i];
}
//找出异或结果为1的下标
int index1 = 0;
while (true) {
if ((x1&(1<<index1)) == (1<<index1)) {
break;
}
index1++;
}
int res1 = 0;
int res2 = 0;
//根据index为1,将原数组中的元素分为两组
for (int i = 0; i < n; i++) {
if ((a[i]&(1<<index1)) == (1<<index1)) {
//对应位为1,异或得到的结果
res1 ^= a[i];
}else {
//对应位为0,异或得到的结果
res2 ^= a[i];
}
}
System.out.println(Math.min(res1, res2)+" " + Math.max(res1, res2));
//题目要求空间复杂度为O(1) ,这种方法是我最熟悉的,但用不了QAQ
//mytest(n, a);
}
public static void mytest(int n, int[] a) {
//用辅助数组来求解
int helper[] = new int[n];
for (int i = 0; i < helper.length; i++) {
helper[a[i]]++;
}
for (int i = 0; i < helper.length; i++) {
if (helper[i] == 1) {
System.out.print(i + " ");
}
}
}
}