c::求数组中的异数~
来源:互联网 发布:康丝0.4数据 编辑:程序博客网 时间:2024/06/13 14:31
函数说明:
1)一个数组中有一个数出现了一次,其余的数字出现了两次。
思路分析:
A: 首先可能会想到的办法是:再建一个数组,进行数组的遍历,遇到相同的数,就放到新的数组中,最终剩下的就是异数。
B:但是上面的这种办法会有开空间的开销,所以我们想到另外一种办法:利用异或,我们知道异或就是相同的数异或为零,针对此题,最终异或下来的数就是异数。
#include<stdio.h>int main(){int a[9] = {1,1,2,3,4,3,4,5,5};int ret = 0;int i = 0;for(i = 0; i<9; i++){ret ^= a[i];}printf("%d\n",ret);return 0;}
2)一个数组中有两个数出现了一次,其余的数字出现了两次。
思路分析:
第一步:将所有的数字异或,得到结果是不同数字的异或结果
第二步:找上部结果中此数任意位置是1的,记录此位置
第三步:找原数组中在此位置是1的数
第四步:将你刚开始设置的变量为0的与是第三步中的数异或, 得到一个不同的数
第五步:将原来两个数异或的结果与第四步中得到的不同数异或,得到另一个不同数
#include<stdio.h>void Find(int a[],int len,int *p1,int *p2){int i = 0;int res = 0;int pos = 0; //记录二进制位位1的位置for(i = 0; i<len; i++) //将所有数进行异或{res^=a[i];}for(i = 0; i<32; i++) //找二进制位中任何位置是1的并记录{if(((res>>i)&1) == 1){pos = i;break;}}for(i = 0; i<len; i++){if(((a[i]>>pos) &1) ==1){(*p1)^=a[i];}}*p2 = res^(*p1);}int main(){int a[10] = {1,1,2,4,4,5,5,3,6,6};int len = sizeof(a)/sizeof(a[0]);int *ret1 = 0;int *ret2 = 0;Find(a,len,&ret1,&ret2);printf("%d\n",ret1);printf("%d\n",ret2);return 0;}
0 0
- c::求数组中的异数~
- 算法学习---求数组中的最大数
- 递归法求数组中的最大数
- Problem C: 数组---求数组中的最大值
- C语言-求三个数中的最大值
- C求十个数中的最大值
- 求数组中的最大数和最小数
- C语言求数组元素中的最小值
- 求数组中的第K小的数
- 如何求数组中的最大数和第二大数
- 求一个数组中的第二大的数?
- 求一个已排序旋转数组中的最小的数
- 把数组中的数拼接起来,求最大值(最小值)
- 求无序数组中的三个数的最大乘积
- 求数组中数的最大值、最小值(C语言)
- 求一串数字中的最大数C程序
- 求一串数字中的最大数C程序
- C语言,3个数中的求最大数
- Android之旅第五站——时间对话框dialog …
- 半年的技术总结帖
- mybatis selectMap方法使用注意事项
- DTLS 技术要点解析
- LeetCode 107. Binary Tree Level Order Traversal II
- c::求数组中的异数~
- 数据库之学习笔记一
- Ubuntu启用Telnet
- 清空TextBox和ComboBox中的内容
- IDEA 常用快捷键
- 一个最简单的dubbo例子实现
- 相同的雪花
- EditText设置输入仅能输入两位小数,并且设置输入边界
- C++ 11