标签:blog io ar os sp for on 2014 log
题目1351:数组中只出现一次的数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2582解决:758 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小。2<=n <= 10^6。 第二行包含n个整数,表示数组元素,元素均为int。 输出: 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。 样例输入: 8 2 4 3 6 3 2 5 5 样例输出: 4 6
#include <iostream> #include<stdio.h> using namespace std; unsigned int findFirstBitIs1(int num){ int indexBit = 0; while(((num&0x01)==0)&&(indexBit<8*sizeof(int))){ num=num>>1; indexBit++; } return indexBit; } bool isBit1(int num, int indexBit){ num = num>>indexBit; return (num&0x01); } void findNumsAppearOnce(int data[],int length,int* num1,int* num2){ if(data==NULL||length<2) return; int resultExclusiveOR = 0; for(int i=0;i<length;i++){ resultExclusiveOR^=data[i]; } unsigned int pos = findFirstBitIs1(resultExclusiveOR); *num1=*num2=0; for(int j=0;j<length;j++){ if(isBit1(data[j],pos)){ *num1^=data[j]; }else{ *num2^=data[j]; } } } int main() { int n; while(scanf("%d",&n)!=EOF){ int* data = new int[n]; int num1=0,num2=0; for(int i=0;i<n;i++){ scanf("%d",&data[i]); } findNumsAppearOnce(data,n,&num1,&num2); int min,max; min = num1<num2?num1:num2; max = num1>num2?num1:num2; printf("%d %d\n",min,max); } return 0; }
标签:blog io ar os sp for on 2014 log
原文地址:http://blog.csdn.net/hackcoder/article/details/41856121