本文主要是介绍题目1351:数组中只出现一次的数字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 题目描述:
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 输入:
- 每个测试案例包括两行:第一行包含一个整数n,表示数组大小。2<=n <= 10^6。第二行包含n个整数,表示数组元素,元素均为int。
- 输出:
- 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
- 样例输入:
-
8 2 4 3 6 3 2 5 5
- 样例输出:
-
4 6
解题思路:如果数组中只有一个数字出现一次,其他的数字都出现两次,则可以对所有的数字进行异或运算,运算的结果即为出现了一次的数字。如果数组中有两个数字,先对所有的数字进行异或运算,运算的结果必不为0,则可以根据异或运算结果的其中不为0一位将原来的数组分为两部分,然后对两部分分别进行异或运算即可以结果。
C++代码:
#include<stdio.h>
#include<stdlib.h>
int arr[1000010];
int main(){//freopen("1.txt","r",stdin);int n;while(scanf("%d",&n)!=EOF){int temp=0;scanf("%d",&arr[0]);temp=arr[0];for(int i=1;i<n;i++){scanf("%d",&arr[i]);temp=temp^arr[i];}int tmp=1;for(int i=0;i<32;i++){if(temp&tmp)break;tmp=tmp<<1;}bool flaga=false,flagb=false;int a=0,b=0;for(int i=0;i<n;i++){if(arr[i]&tmp){if(flaga){a=a^arr[i];}else{a=arr[i];flaga=true;}}else{if(flagb){b=b^arr[i];}else{b=arr[i];flagb=true;}}}if(a<b)printf("%d %d\n",a,b);elseprintf("%d %d\n",b,a);}return 0;
}
这篇关于题目1351:数组中只出现一次的数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!