原题:给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数。

编写函数实现。

对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,经过分析发现异或全部数组的数所得到的数为整个数组中两个只出现一次数异或的结果先对所有的元素进行异或。可以通过将结果转换为二进制,在移位二进制数中的第一个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;
}

转载于:https://blog.51cto.com/luoyafei/1715263

找出数组中两个只出现了一次的数相关推荐

  1. 微策略2011校园招聘笔试题(找出数组中两个只出现一次的数字)

    1.8*8的棋盘上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下 ...

  2. 找出数组中两个只出现一次的数字

    题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字 通过这道题感觉位运算很强大~这道题利用异或的几个性质:任何数与其本身异或值都为0,异或运算满足交换律. ...

  3. 【算法14】找出数组中两个只出现一次的数字

    [题 目]一个整型数组中除了两个数字外,其他的数字都出现两次.请找出这两个只在数组中出现一次的数字.要求时间复杂度O(n),空间复杂度O(1). [思 路]首先我们考虑一个稍微简单点的情况:如果这个数 ...

  4. 找出数组中两数之和为指定值的所有整数对

    一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一 ...

  5. c语言实现在数组中找一个数字显示,C语言找出数组中的特定元素的算法解析

    问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它.能否只用一个额外数组和少量其它空间实现. 思路:如果能用两个辅助数组,那么相对 ...

  6. 找出数组中只出现了一次的数字(Java)

    找出数组中只出现了一次的数字 题目 题目分析 方法1 方法2 方法3 代码实现 主方法 方法1 第一种:使用计数器的 第二种:不使用计数器 方法2 方法3 总结 题目 给定一个非空整数数组,除了某个元 ...

  7. 找出数组中出现次数超过一半的数

    算法--找出数组中出现次数超过一半的数      每当我看到经典的算法题,就怀念高中,感觉很多算法题就是高中的题目,谁叫哥只读了个专科,高数基本相当没学.      有空要看看高数啊,想当年数学那是相 ...

  8. [LeetCode] Find All Numbers Disappeared in an Array 找出数组中所有消失的数字

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  9. 找出数组中最大值次大值的一次遍历方法(C++)

    写在前面 昨天做了一道LeetCode题(747. 至少是其他数字两倍的最大数 - 力扣(LeetCode) (leetcode-cn.com)), 大致意思是找出数组中的最大值和次大值并返回最大值索 ...

最新文章

  1. freemarker-ide eclipse安装地址 安装方法 页面静态化
  2. 【事故反演】事故反演问题排查
  3. 通过反射获取DLL的类实现加载窗体
  4. C++ Primer 5th笔记(chap 18 大型程序工具)使用命名空间成员
  5. 【机器学习算法专题(蓄力计划)】八、机器学习中数据的方差分析
  6. php实现 字符串加密(分类分布分工,化不可能为可能)
  7. Python+pandas处理Excel文件中的超市营业额数据
  8. 读《高性能网站建设指南》有感
  9. android开发之路05
  10. java textarea 自动滚动条,textarea根据内容自动延伸,不显示滚动条
  11. 一个INT 10H中断的小例子
  12. 大学英语精读第三版(第五册)复习笔记——文章内容摘要
  13. 华为云备份显示服务器异常(1008),云盘服务器异常
  14. 玩客云手动设置IP地址
  15. 等保2.0基本要求与等保1.0对比解读
  16. MobPush for Flutter
  17. 支付宝 APP登录 获取用户信息 PHP
  18. EMC设计理论通俗非科班学习笔记(完结)
  19. grib2文件格式说明 文件结构
  20. 2542 咖啡和作业 (简单二分)

热门文章

  1. 汇编语言——第1次上机实验
  2. uva10780 - Again Prime? No time
  3. 软件工程---17.分布式软件工程
  4. 【git】解决gitlab ip更改问题
  5. 条件变量实现线程同步
  6. (NFS)mount.nfs: access denied by server while mounting localhost:/home/xuwq/minilinux/system
  7. 使用gdb调试多进程程序、同时调试父进程和子进程
  8. 【算法】蛮力法/穷举法/枚举法 的基本问题分析
  9. install npm 到某个文件下执行_你可能不知道的 npm 依赖管理那些事
  10. PHP----学生管理系统