-
题目描述:
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
-
输入:
-
每个测试案例包括两行:第一行包含一个整数n,表示数组大小。2<=n <= 10^6。第二行包含n个整数,表示数组元素,元素均为int。
-
输出:
- 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
-
样例输入:
-
8 2 4 3 6 3 2 5 5
-
样例输出:
-
4 6
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1351
这道题目,如果数只出现一次的数只有一个,那么直接是有异或就可以求出。因为相同的数异或为0,0与任何如异或还是数本身。
这道题目,就是要想一个办法,把这个数组转换成上述情况。
直接的,
想出一个标准,让相同的数都会若在一个数组当中,出现一次的数分别位于不同的两个数组当中。
所有数异或之后的结果,就是目标两个数的异或结果。相同的位结果为0,不同的位结果为1,。我们可以选择其中任意一个为1的位作为分隔两个数组的标准。(相同的数,其每一位都是相同的,会分到同一个数组当中)。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; int main() { int n ,i; while(scanf("%d",&n)!=EOF){ int pre=0; int *num=new int [n]; for(i=0;i<n;i++){ int tmp; scanf("%d",&num[i]); pre^=num[i]; } int pivot=pre&(-pre); int a=0,b=0; for(i=0;i<n;i++){ if((pivot&num[i])!=0) a=num[i]^a; else b=num[i]^b; } printf("%d %d\n",min(a,b),max(a,b)); } return 0; }