数组中只出现一次的数字——位运算
2013-01-13 21:09
239 查看
http://ac.jobdu.com/problem.php?cid=1039&pid=22
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
问题1:如果是寻找只有一个出现一次的数字,比较简单的,只要所有数字异或一次即可
问题2:找出这两个只出现一次的数字,就要将所有的数字分成两堆,每堆个包含一个出现一次的数字:先把所有数字异或下得到一个数A,A的二进制中的某一位为1,这时就可以以所有数二进制某一位是否为1分成两堆,这是回到了问题一
View Code
再输入加速,排到了第二
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
问题1:如果是寻找只有一个出现一次的数字,比较简单的,只要所有数字异或一次即可
问题2:找出这两个只出现一次的数字,就要将所有的数字分成两堆,每堆个包含一个出现一次的数字:先把所有数字异或下得到一个数A,A的二进制中的某一位为1,这时就可以以所有数二进制某一位是否为1分成两堆,这是回到了问题一
View Code
#include<stdio.h> int a[1000009]; int b[1000009],c[1000009]; template <class T> inline void scan_d(T &ret) { char c; ret=0; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar(); } int main() { int n; while(scanf("%d",&n)!=EOF) { int i; for(i=1;i<=n;++i){ scan_d(a[i]); } int left=a[1]; for(i=2;i<=n;++i){ left=left^a[i]; } int addl=0,addr=0,add=0; while(((1<<add)&left)==0) ++add;; int temp=1<<add; for(i=1;i<=n;i++){ if(a[i]&temp){++addl; b[addl]=a[i]; } else{++addr; c[addr]=a[i]; } } int min=b[1],max=c[1]; for(i=2;i<=addl;++i){ min=min^b[i]; } for(i=2;i<=addr;++i){ max=max^c[i]; } if(min>max){ temp=max;max=min;min=temp; } printf("%d %d\n",min,max); } return 0; }
再输入加速,排到了第二
相关文章推荐
- 九度OJ 1351:数组中只出现一次的数字 (位运算)
- 九度OJ 1351:数组中只出现一次的数字 (位运算)
- 剑指offer——数组中只出现一次的数字(好题,熟悉位运算)
- 神奇的位运算——数组中仅出现一次的数字
- 数组中只出现一次的数字(异或方法)
- 剑指Offer----面试题40:数组中出现一次的数字
- 数组中只出现一次的两个不同数字
- 剑指 offer set 18 数组中只出现一次的数字
- 可判断数据中有多个数字只出现一次,其他所有数字都是成对出现的。然后输出这些数字。(使用位运算)
- 剑指Offer38 数组所有数字出现两次,只有两个出现了一次,找出这两个数字
- 找出数组中两个只出现一次的数字
- 【剑指offer】数字数组中只出现一次(2)
- 【3】数字数组中只出现一次
- 面试题40(数组中出现一次的数字)
- 【剑指offer】数组中只出现一次的数字
- 找出数组中两个只出现一次的数字
- 【01】数组中只出现一次的数字
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 【剑指offer之数组中只出现一次的数字】
- 微软面试100题-61(找出数组中两个只出现一次的数字)