数组中只出现一次的数字
来源:互联网 发布:激光聚焦矩阵 mc百科 编辑:程序博客网 时间:2024/06/03 07:48
题目
一个整型数组里除了两个数字之外,其他数字都出现了两次。请找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)
思路
我们知道如果把题目中的两个数字换成一个的话,整个数组内的元素连续异或,最终的数便是那个出现一次的数,因为异或的性质:相同为0,不同为1,所以有任何数字异或自己都是0。
换成两个数字后,我们可以继续全局异或,得到的数必然不等于0,那么也就是说二进制中必然有一位是1,比如是第K位为1,那么按照所有元素的第K位是否为1划分成两个子区间,这样,我们在这两个子区间内按照第一次的方法求解即可。
代码
public static void getTwotimeNumber(int [] num){if(num == null || num.length < 0)return ;int sum = num[0];for(int i=1;i<num.length ;i++)sum = sum^num[i];String sumBin = Integer.toBinaryString(sum); //获取最终和的二进制 int index = sumBin.length()-sumBin.lastIndexOf("1")-1; //判断最后一位二进制的下标//System.out.println(index);int result1 = 0;int result2 = 0;for(int i = 0;i<num.length ;i++){if(((num[i]>>index) & 1) ==1)result1 ^= num[i];elseresult2 ^= num[i];}System.out.println(result1+"...."+result2); }
延伸
看完这个题目,我又想到了如果数组中出现一次的数字有3个,4个,5个......,那就是怎么找出数组中不重复的数字或者是找出数组中重复的数字。
有这么个题目:长度为N的数组,元素都是1~N,查找重复的数字
有这么几种思路:
1、先快排,然后判断相邻元素是否相同,时间复杂度O(nLogN)
2、比如第 i 个位置的数字为 j ,我们将 j 交换到下标为 j 的数组上,如果某一次发现已经交换过了,那么此数重复
3、利用Java中的BitSet,每一位为0或1,所以类似上面的,比如当找到5的时候,我们将BitSet的第5位置为true,默认是false,所以当某一次发现该位上的没设置就已经成为true,就说明肯定出现过重复
最后推荐 一些面试题,转关注的一个博客, 上面总结的不错。
0 0
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- c++程序设计课程--简单的设计任务
- 检查二叉树是否平衡
- 书宜杂读,业宜精钻
- java.util.zip.ZipException: error in opening zip file
- wordpress 用户控制插件
- 数组中只出现一次的数字
- Easy Ui Layout控件
- Try These 9 Tricks To Sleep Better At Night
- 20150821日报
- iOS7系统iLEX RAT冬青鼠安装教程:无需刷机还原纯净越狱系统
- R语言中按照列之和进行升降排序data frame
- MEAN框架介绍
- 【GDOI】8.21训练总结
- [LeetCode] Ugly Number II