题目描述

已知一个数组,现在请你用时间复杂度O(n),空间复杂度O(1)的算法求解:
1.假设数组中只有一个数的数量为奇数,其余都是偶数,请求出这个数。
2.假设数组中有两个数的数量为奇数,其余都是偶数,请求出这两个数。

问题一解法

问题一比较容易,只有一个数的数量为奇数,那么,设定一个变量,然后依次异或整个数组,最后剩下的数就是那个奇数。
原理分析:因为异或运算中,同一个数和自己本身异或的结果为0,0和任何数异或的结果不变,因此,所有偶数的异或结果为0,然后0和奇数个数的那个数异或的结果不变,因此,最后剩下的就是那个奇数。
代码

    public static int getOnlyJiShu(int[] arr){int res=0;for (int i = 0; i < arr.length; i++) {res=res^arr[i];}return res;}

问题二解法

1.首先,参考 问题一的思路,我们还是把数组中所有的数异或一遍,结果为那两个奇数异或。例如,数组中a和b的数量为奇数,那么,把整个数组异或一遍后,结果为a^b
2.拿到了a^b的结果,我们如何将ab分开呢?这里,可以想象,既然题目给了两个数,那么,ab就不可能相等,对吧?两个不相等的数,异或的结果,肯定至少有某一位二进制不为0。 为什么?因为异或运算就是相同为0,不同为1,如果ab异或的结果为0,说明ab每一位都相等,对吧?那a就等于b,显然,题目条件给的是ab不等,因此,ab异或的结果,肯定不为0,也就是说,肯定某一个二进制位不为0。
3.从第二步推理可以看出,a^b的结果不为0,那么,我们可以任意找一位1,1说明在这一位上,ab是不相同的。然后,再设定一个变量,根据这一位是0还是1,其实都可以,然后再次异或遍历整个数组,结果就是ab中的一个。
这一步怎么理解?可以理解为,根据ab异或为1的那一位,将ab在原来的数组中分到两个区间内,然后,在原来的数组中的一个区间内再次用异或运算遍历,就能得到ab中的一个数。至于两个区间分开后,其他偶数肯定也分开到两个区间了,并且相同的偶数肯定在同一个区间,因此,偶数异或的结果仍然全部是0。
4.最后,只需要用a^b的结果,再次异或ab中的一个,另一个也就求出来了。

代码

    public static void getTwoJiShu(int[] arr){int res=0;for (int i = 0; i < arr.length; i++) {res=res^arr[i];}//获取最右边的1int rightOne=res&(~res+1);int resOne=0;for (int i = 0; i < arr.length; i++) {if((arr[i]&rightOne)==0){resOne=resOne^arr[i];}}System.out.println(resOne+"   "+(resOne^res));}

代码中,如何获取最右边的第一位1的代码比较经典:
int rightOne=res&(~res+1);
~res是取反操作,二进制0变1,1变0
取反后加1,其实就是补码。
补码和原数相与的结果,就是原数右边第一位为1的数,其余都是0

异或运算练习:找出一组数中唯一(唯二)出现奇数次的数相关推荐

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

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

  2. 粒子群(PSO)、量子粒子群(QPSO)优化LSTM网络超参数,以均方差为适应度,找出一组网络超参数,解决网络设置参数盲目性的问题

    粒子群(PSO).量子粒子群(QPSO)优化LSTM网络超参数,以均方差为适应度,找出一组网络超参数,解决网络设置参数盲目性的问题. 可用于负荷预测,风电功率预测,光伏发电预测等时序序列,matlab ...

  3. 如何用matlab找出一组离散数据中的峰值

    如何用matlab找出一组离散数据中的峰值 对于一组离散数据,我们经常需要找出其中的峰值,如下一组离散数据: x = [1 2 3 4 3 2 1 5 8 9 17 12 11 5 3 2 1 7 1 ...

  4. C语言习题:输入10个学生5门课的成绩,分别用函数求:①每个学生平均分;②每门课的平均分;③找出所有分数中最高分

    初学C语言,然后遇到一题: 输入10个学生5门课的成绩,分别用函数求:①每个学生平均分:②每门课的平均分:③找出所有分数中最高分 直接上代碼 注:自定义函数(xpj,kpj,maxj)我直接放在最前面 ...

  5. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

  6. 找出一个数组中出现次数最多的那个元素

    Description 找出一个数组中出现次数最多的那个元素 Input 多组输入,请处理到文件结束 每组第一行输入一个整数n(不大于20) 第二行输入n个整数 Output 找出n个整数中出现次数最 ...

  7. 如何快速找出一个数组中最大数和第二大数

    看到一道题是:快速找出一个数组中最大数和第二大数. 我之前学了一些数组排序,例如冒泡排序,简单选择排序等等,然后我就想可不可以利用冒泡排序来实现呢?之前写过冒泡排序实现从小到大的排列,那么可以改成从大 ...

  8. 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值

    我觉得写得很清晰,希望没有侵犯作者的著作权,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一个数组中的两个数字,让这 ...

  9. 7-3 最矮的巨人 (4 分)操场上有N x N个“巨人”按N行N列的矩阵形式列队,请编程找出该方阵中所有“最矮的巨人”。

    7-3 最矮的巨人 (4 分) 操场上有N x N个"巨人"按N行N列的矩阵形式列队,请编程找出该方阵中所有"最矮的巨人". 所谓"最矮的巨人&quo ...

  10. 找不同(给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。)

    给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "abcd&quo ...

最新文章

  1. C语言网络编程:UDP通信实现
  2. “一百万行Python代码对任何人都足够了”
  3. 计算机专业西电和大工怎么选,放弃985大连理工,选择211西安电子科大,其实很多人都错了...
  4. solaris下ftp配置说明
  5. double free or corruption (fasttop)
  6. 翻译连载 | JavaScript轻量级函数式编程-第7章: 闭包vs对象 |《你不知道的JS》姊妹篇...
  7. Hdu 1312 Red and Black
  8. mysql性能分析工具profiling_Mysql系列(十)—— 性能分析工具profiling
  9. PHP——smarty模板(第一天)
  10. 在D-Bus适配器中声明信号
  11. python写传奇脚本,Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...
  12. php input框圆角样式,CSS如何实现边框圆角
  13. (第一周)软件工程四人组
  14. anaconda离线安装pytorch
  15. CF 128A Statues
  16. 网站死链接检测查询工具
  17. 计算机信息量单位kbit,网络的带宽和速率
  18. 2021年安全员-C证(陕西省)考试总结及安全员-C证(陕西省)模拟考试系统
  19. 融智学 作者 邹晓辉 Smart System Studied By Xiaohui Zou (今日头条公布其汉英双文简纲)
  20. 计算机itunes无法安装,Win7 iTunes安装出错怎么办?电脑上无法安装iTunes怎么解决?...

热门文章

  1. GNSS/GPS 精度(RMS,CEP,Sigma) 与精度因子(DOP)
  2. java导出word
  3. 4.2 里氏替换原则
  4. 本地电脑搭建Plex私人影音云盘教程,内网穿透实现远程访问
  5. Hdu 5338 ZZX and Permutations(线段树+贪心)
  6. FilterDispatcher is deprecated! 1
  7. 一个实习生java面试过程班,秋招,实习,面试,offer之路
  8. c语言递归求差分方程,关于差分方程
  9. 【JVM】常见调试排错场景、内存与线程Dump分析
  10. smc K9F1208U0M 读写操作 续(s3c2410 nand flash 学习)