剑指Offer 40 数组中只出现一次的数字
来源:互联网 发布:正版办公软件 编辑:程序博客网 时间:2024/06/05 07:09
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路
- 这不是一道正常题,因为他的考点就是异或运算;我刚开始还在想先排个序,然后每次移动两位;这样就可以比较出来了;然而时间复杂度O(n)可以接受,空间复杂度O(1)是什么鬼? 除了异或运算应该不可能做到的吧;
- 讲讲异或运算,相同的数字亦或运算后就是零;1^0=0^1 = 1;0^0=1^1=0;
所以我们就获得了重要情报,一群出现两次的数和一个只出现一次的数进行异或运算就是这个只出现一次的;
那么两个怎么办呢?首先对全部进行异或运算,得到的肯定不是0,因为有两个不一样嘛,这个数中二进制1的位置,表现了两个只出现一次的数的不同,然后我们就可以据此分类;
代码
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if (array==null||array.length<2) //用例检查 return; int allxor=0; //用于全部异或 for (int i = 0; i < array.length; i++) { allxor^= array[i]; } int flag = 1; while ((allxor & flag)==0) //找的这么一个特征值 flag <<= 1; //移动1的位置 for (int i = 0; i < array.length; i++) { //通过特征值分组 if ((array[i]&flag)==0) num1[0] ^= array[i]; else num2[0] ^= array[i]; } }
收获
- 异或运算真是太强大了;
- java在位运算上总感觉没有C那么自然;
0 0
- 剑指offer-40 数组中只出现一次的数字
- 剑指offer 40-数组中只出现一次的数字
- 剑指offer 40 数组中只出现一次的数字
- 《剑指offer》:[40]数组中只出现一次的数字
- 剑指Offer 40 数组中只出现一次的数字
- 剑指offer--数组中只出现一次的数字
- 剑指Offer之 - 数组中只出现一次的数字
- [剑指Offer]40.数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- 《剑指offer》数组中只出现一次的数字
- 剑指offer—数组中只出现一次的数字
- 【剑指offer】之数组中只出现一次的数字
- [剑指offer-1351]数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer:数组中只出现一次的数字
- 剑指offer 数组中只出现一次的数字
- [剑指offer]数组中只出现一次的数字
- 剑指Offer--040-数组中只出现一次的数字
- Spring的AOP
- 机器学习笔记3---cost function
- POJ 2136 Vertical Histogram G++
- 204. Count Primes (java)
- Arrays.sort
- 剑指Offer 40 数组中只出现一次的数字
- Java泛型
- c++基础之string常用函数
- 三菱PLC编程软件 GX Developer 8.86 中文版的下载与安装 (win 7 64位)
- 图的最小生成树
- HUSTOJ搭建执行(LAMP+hustoj+myphpadmin)
- 消除重复元素
- Aladdin and the Flying Carpet LightOJ
- 蓝桥杯 城市建设(kruscal变形)