问题1:一个数组中除一个数只出现一次外其它数字都出现了两次,找出这个数,编程实现。

分析:当写出数组中每个元素的二进制序列时,很明显除了要找的数Num的二进制序列外其它序列都是成对出现的。我们知道两个完全相同的二进制序列异或(^)以后是0,所以在这里首先将0赋给Num(语句:Num = 0;),然后将数组的每个元素与Num进行异或操作,最终累计后Num的值就是要找的数。代码实现如下:

int FindNum(int a[],size_t n)
{int Num = 0;for (size_t i = 0; i < n;++i){Num^= a[i];}return Num;
}

问题2:一个数组中除两个数只出现一次外其它数字都出现了两次,找出这个数,编程实现。

分析:显然这个问题是上面问题的扩展或升级,所以这里通过处理将它转化成上面问题是一个很不错的思路。我们定义一个变量ret并将其初始化为0,经过下面这个循环

int ret = 0;
for (size_t i = 0; i < n;++i)
{ret ^= a[i];
}

得到的ret实质上是要找的Num1与Num2异或的结果,因Num1与Num2是不同的两个数,所以ret的二进制序列中至少有一个位置是1,Num1与Num2的二进制序列在这个位置的特点是一个为1另一个为0。我们定义一个变量pos并将其初始化为0(这里规定二进制序列右边起第一个位置用0标记,以此类推),经过下面这个循环后

        int pos = 0;while (1){if ((ret>>pos) & 1 == 1)break;++pos;}

pos标记的位置是ret的二进制序列从右起第一次出现1的那个位置。其实数组中部分元素的二进制序列在pos位置是1,部分元素的二进制序列在pos位置是0。到这里你仔细想,我们把数组中二进制序列在pos位置是1放到一起后这组数据的特点正是问题一所描述的那样,即就是除了一个数字外其他数字都是成对出现的,这里所指的“一个数字”真是我们要找的其中之一;再把数组中二进制序列在pos位置是0的放到一起也是同样的。利用这个思想具体找Num1与Num2的局部代码如下:

        for (size_t i = 0; i < n; ++i){if ((a[i]>>pos)&1 == 1)Ret.Num1 ^= a[i];elseRet.Num2 ^= a[i];}

整个问题的代码实现如下( 具体实现用了一个结构体,完全是为了函数返回时更方便整齐 ):


typedef struct NUM
{int Num1;int Num2;
};struct NUM FindTwoNum(int a[], size_t n)
{struct NUM Ret;Ret.Num1 = 0;Ret.Num2 = 0;int ret = 0;for (size_t i = 0; i < n;++i){ret ^= a[i];}int pos = 0;while (1){if ((ret>>pos) & 1 == 1)break;++pos;}for (size_t i = 0; i < n; ++i){if ((a[i]>>pos)&1 == 1)Ret.Num1 ^= a[i];elseRet.Num2 ^= a[i];}return Ret;
}

【C实现算法00】一个数组中除一个(两个)数只出现一次外其它数字都出现了两次,找出这个数,编程实现。相关推荐

  1. 找出一个数组中唯一一个出现2次的数字

    找出一个数组中唯一一个出现2次的数字,不清楚是不是LeetCode上的题.本人默认是LeetCode上的题. 一个数组中有N个数字,但是只有一个数字出现了2次,其他的数字均不相同.这种问题一般应该采用 ...

  2. 算法12--topK求一个数组中第k大的数

    求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...

  3. 找到一个数组中每一个元素第一个比它大的元素

    一.题目描述 给定义个数组v,对于数组中每一个元素,找到其后面元素中第一个比它大的元素,并且记录在数组v2中返回.例如给定数组v = {1,3,6,-1,2},返回v2={3,6,-1,2,-1}.( ...

  4. php从一个字符串中过滤掉英文,php过滤只保留中文,英文以及数字的方法

    今天在开发一个关于QQ号登录的功能时,发现获取的QQ号昵称中有的带有一些特殊的字符.而这些带有特殊字符的昵称在其它功能中调用时会发生一些判断错误,所以就写了一个过滤的正规表达式,用来过滤昵称中的特殊字 ...

  5. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  6. java查找第k大的数字_[经典算法题]寻找数组中第K大的数的方法总结

    今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以 ...

  7. Leetcode-215:求一个数组中第k大的数

    题目描述 给定一个未排序的整数数组,找到其中第k大的数 样例: 给出数组[4,5,1,2,3]和k=3,返回3: 给出数组[7,9,4,5]和k=1,返回9. 要求时间复杂度为O(n),空间复杂度为O ...

  8. 算法题:“找出单身狗”--找出一个数组中只出现一次的数字

    题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次. 编写一个函数找出这两个只出现一次的数字. 解题过程以及思路:(思路在代码中以注释形式给出) //一个数组中只有两个数字是出现一次,其 ...

  9. 算法题:找出一个数组中相加值最大的连续序列元素

    package arithmetic;/*** @author SHI* 求一个数组中相加值最大的连续序列元素*/ public class MaxSequence {public static vo ...

  10. 【算法】异或 偶数数组中找到一个唯一奇数

    文章目录 1.概述 2.扩展 1.概述 题目如下:已知一个数组中,只有一个数字出现奇数次,其他数字出现偶数次,如何找到这个奇数的数字,而且要求尽量简单,而且时间复杂度为O(n) /*** 测试点: 已 ...

最新文章

  1. 面试常碰到++p/p--问题到底结果是什么?
  2. 华三交换机升级的ipe文件_弱电工程工业以太网交换机电源故障总结
  3. c-nominated = ((rcheck-use_candidate) || c-nominated);
  4. android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...
  5. opengl游戏引擎源码_渲染概念:1.引擎二三事
  6. 挂代理无法访问网页了怎么办_微信H5网页授权
  7. Python技巧-只用一行代码轻松实现图片文本识别
  8. 无向图双连通分量BCC(全网最好理解)
  9. 腾讯3轮面试都问了Android事件分发,论程序员成长的正确姿势
  10. 1.4 编程基础之逻辑表达式与条件分支 16 三角形判断
  11. delphi5开发人员指南_成为企业家并发挥作用的开发人员指南
  12. 【转】使用EBNF相对于BNF表示的优越性
  13. 嘉年华回顾丨李圣陶带你了解阿里巴巴智能化运维的奥秘
  14. 超详细的MySQL工作原理 体系结构
  15. 动态生成圈形+文字的图片
  16. 转载 openlayers 3.0 教程
  17. Linux下gcc/g++、make和cmake的区别
  18. ExtendSim 10.0.8发布于 2021年8月7日
  19. 堆排序算法——C/C++
  20. 该死的强迫症,教你stm32怎么把杜邦线弄整齐

热门文章

  1. 试图通俗地讲一下庞加莱猜想是怎么回事
  2. QQ邮箱一键删除所有邮件的方法
  3. Facebook账号注册需要注意什么?Facebook养号技巧?
  4. FAQ详解“Meltdown和Spectre”问题,接踵而来的“Skyfall和Solace”是否仅是骗局?
  5. camera一些常见名词缩写
  6. 外贸常用术语_常用外贸术语大全,外贸人的必备
  7. 华为云盘(华为云空间)免费空间
  8. S3C2440裸机开发----点亮LED
  9. 商务英语计算机,怎样练习商务英语口语
  10. Springboot毕设项目基于协同过滤算法的体育用品推荐系统9s658java+VUE+Mybatis+Maven+Mysql+sprnig)