找出数组中两个只出现了一次的数
来源:互联网 发布:童星大道网络选举 编辑:程序博客网 时间:2024/05/04 04:40
原题:给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数。
编写函数实现。
对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,经过分析发现异或全部数组的数所得到的数为整个数组中两个只出现一次数异或的结果先对所有的元素进行异或。可以通过将结果转换为二进制,在移位二进制数中的第一个1,然后根据这个1的判断条件将整个数组分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数。
例如:数组中的元素为下面这些数:
0000 --0
0000 --0
0001 --1
0001 --1
0010 --2
0011 --3
0011 --3
0100 --4
0100 --4
0101 --5
全部元素异或的结果为:0111 以最后面的1为条件,分为第一组(1、1、3、3、5)和第二组(0、0、2、4、4),分别对两组元素进行全部异或。
代码如下:
#include<stdio.h>#include<stdlib.h>int find_one(int num)//返回二进制数find中第一个出现1的位数,即位移量{int tmp = 0;while (num){if (num & 1 == 1)//进行与运算,找出现1的位数{return tmp;}else{tmp++;num = num >> 1;}}return -1;}int find(int str[],int size,int *p1,int *p2){int find = 0;int i,pos;for (i = 0; i < size; i++){//异或整个数组的数所得到的数find,即为数组中两个只出现一次数异或的结果find ^= str[i];}pos=find_one(find);for (i = 0; i < size; i++){//将整个数组分成两部分,找出两个数if (1 & (str[i] >> pos)){*p1 ^= str[i];}else{*p2 ^= str[i];}}}int main(){int arr[] = { 1, 2, 3, 5, 7, 2, 5, 1 };int len;int num1 = 0;int num2 = 0;len = sizeof(arr) / sizeof(arr[0]);find(arr, len,&num1,&num2);//注意此处num1和num2应传递地址printf("%d %d\n", num1, num2);system("pause");return 0;}
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1715263
- 找出数组中两个只出现了一次的数
- 数组------找出数组中只出现一次的两个数
- 找出数组中两个只出现一次的数
- 找出数组中只出现一次的两个数
- 找出一个数组中只出现一次的两个数
- 整数数组中找出只出现了一次的数
- 找出只出现一次的两个数
- 找出两个只出现一次的数
- 如何快速找出数组中只出现一次的两个数
- 从数组中找出只出现一次的两个数,数组中其他数都出现两次
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字--总结
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 在终端输入多行信息,找出包含“ould”的行,并打印改行
- 编写冒泡排序,排序一个整形数组
- 模拟实现printf
- 调整数组使奇数全部都位于偶数前面
- 实现memcpy和memmove函数
- 找出数组中两个只出现了一次的数
- 实现常用字符串处理函数(不调用库函数)
- strlen函数的多种实现方式
- 编写冒泡排序,可以排序整形数组,也可以排序字符串
- 实现一个简易通讯录
- 注释转换
- 排序算法比较
- 顺序表一系列操作
- 360