剑指offer-40.数组中只出现一次的数字
来源:互联网 发布:金庸群侠传 武功数据 编辑:程序博客网 时间:2024/05/17 17:54
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。
思路:
1.假设数组中只有一个出现一次的数字,其余的都出现两次,则只需将数组的全部数字依次异或,结果即为所求。因为(1) a ⊕ a = 0; (2)a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
2.现数组中有两个出现一次的数字,若还是全部异或,则结果为这两个出现一次的数字的异或结果;那能不能想办法将这两个数字给分开,分到两个子数组中,这样就回到了1中的问题。
3.显然是可以的,既然将其分开,那分开的标准是什么。既然已经知道了他们的异或结果,而且两数字不同,则结果中肯定有1的位数(否则全是0的话,两个数就一样了),找出倒数第一个1出现的位数,将所有这个位上是1分到一起,不是1的分到一起。就变成了1中的问题。
注意:判断倒数第一个1出现的位出现的位数时,可以结合按位与(&)和右位移(>>),例如:n&1 == 0,则n的末位是0,否则是1。
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public void findNumsAppearOnce(int [] array,int num1[] , int num2[]) { int r1 = 0; int indexOf1 = 0; for (int i = 0; i < array.length; i++) { r1 = r1 ^ array[i]; } //找出异或结果中倒数第一个1的所在的位 while((r1 & 1) == 0 && indexOf1 < 32){ r1 = r1 >> 1; indexOf1++; } //根据倒数第indexOf1位是不是1将原数组划分为两个子数组同时进行异或运算,最后留下来的分别都是出现次数为1的数 for (int i = 0; i < array.length; i++) { if(((array[i] >> indexOf1) & 1) == 1){ num1[0] = num1[0] ^ array[i]; } else{ num2[0] = num2[0] ^ array[i]; } } }
阅读全文
0 0
- [剑指Offer]40.数组中只出现一次的数字
- 剑指offer 40. 数组中只出现一次的数字
- 剑指offer-40.数组中只出现一次的数字
- 剑指offer-40.数组中只出现一次的数字
- 剑指offer--数组中只出现一次的数字
- 剑指Offer之 - 数组中只出现一次的数字
- 剑指offer-40 数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- 剑指offer 40-数组中只出现一次的数字
- 《剑指offer》数组中只出现一次的数字
- 剑指offer—数组中只出现一次的数字
- 【剑指offer】之数组中只出现一次的数字
- [剑指offer-1351]数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 40 数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- [剑指offer]数组中只出现一次的数字
- HttpServletResponse
- 约瑟夫问题--双向循环链表的创建与删除
- 贪心算法poj 3617,3069,3253
- sem的关键词怎么拓展、分组、导入客户端,世上最全为你解决!!(网络营销sem)
- 操作系统知识整理3:进程管理
- 剑指offer-40.数组中只出现一次的数字
- Servlet过滤器Filter和监听器
- Caffe-windows入门学习,编译、训练、测试详细教程
- 关于WdatePicker控件的onchange事件如何使用————2017/8/5
- GMM的C++实现
- windows dos下pip install numpy 出现错误:Permission denied
- 【Mysql 优化 6】mysql优化的内容和思路
- Unable to correct problems, you have held broken packages
- 如何快速转载CSDN中博客内容