剑指offer37--找出数组中只出现1次的两个数
来源:互联网 发布:手机主板检测软件 编辑:程序博客网 时间:2024/05/18 02:51
一、题目
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
二、举例
例如输入数组{2, 4, 3, 6, 3, 2, 5 },因为只有4 、6 这两个数字只出现一次,其他数字都出现了两次,所以输出4和6。
三、思想
1. 首先数组中所有元素依次异或,因为相同的元素异或得到0,所以最终的答案就等于那2个唯一的元素a^b的值。
2. 因为a,b不同,所以异或得到的答案肯定是不等于0的,那么我们就找到a^b的二进制表示中第一个为1的位,假如是第k位。而a,b
两个数在第k位上是不同的,一个为0,一个为1
3. 接下来我们将第k位是1的分成一组,第k位是0的分成一组,如果2个元素相同,那么他们第k位肯定是一样的,所以肯定被分到同一组中。而a,b则被分到2组中去了。然后我们就可以在每个分组中异或每一个元素,最终就可以得到那2个唯一的元素。
四、程序
package 剑指offer;public class Test40 { public static int[] findNumbersAppearanceOnce(int[] data) { int[] result = {0, 0}; // 边界情况判断 if (data == null || data.length < 2) { return result; } int xor = 0; // 遍历数组data,大括号中的i就相当于data[i] for (int i : data) { xor ^= i; } // 找到所有数据异或结果中第一个不为零的数据位 int indexOf1 = findFirstBit1(xor); // 遍历,通过判断indexOf1位是不是1将数组分成两组 for (int i : data) { // 将是1的一组相互异或 if (isBit1(i, indexOf1)) { result[0] ^= i; } else { // 将不是1的一组相互异或 result[1] ^= i; } } return result; } private static int findFirstBit1(int num) { int index = 0; while ((num & 1) == 0 && index < 32) { num >>>= 1; index++; } return index; } private static boolean isBit1(int num, int indexBit) { num >>>= indexBit; return (num & 1) == 1; } public static void main(String[] args) { int[] data1 = {2, 4, 3, 6, 3, 2, 5, 5}; int[] result1 = findNumbersAppearanceOnce(data1); System.out.println(result1[0] + " " + result1[1]); }
五、收获
1、了解for(i :data){ i }的使用方式,其中大括号中i代表的是data[i]
2、异或是指位之间的异或,巧妙地使用异或来分组,还有>>>=代表的是位的右移,左边补充0
1 0
- 剑指offer37--找出数组中只出现1次的两个数
- 数组------找出数组中只出现一次的两个数
- 剑指offer----找出数组中出现过1次的两个数
- 找出数组中两个只出现一次的数
- 找出数组中两个只出现了一次的数
- 找出数组中只出现一次的两个数
- 找出一个数组中只出现一次的两个数
- 找出数组中2个只出现1次的数,其他数都出现2次
- 找出数组中2个只出现1次的数,其他数都出现2次
- 找出数组中只出现1次的数(各种变形)
- 某数组中两个数出现奇数次,剩余的出现偶数次,找出这两个数
- 数组中只出现1次的两个数字
- 数组中只出现1次的两个数字
- 数组中只出现1次的两个数字
- 数组中只出现1次的两个数字
- 数组中只出现1次的两个数字
- 从数组中找出只出现一次的两个数,数组中其他数都出现两次
- 一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数
- 欢迎使用CSDN-markdown编辑器
- [bzoj2733][HNOI2012]永无乡
- 持久层内存溢出
- Flask: Ajax 设置Access-Control-Allow-Origin实现跨域访问;Ajax页面底部自动加载
- acm之贪心算法题目7
- 剑指offer37--找出数组中只出现1次的两个数
- R通过RJDBC连接外部数据库
- 程繁问于乐
- acm之贪心算法题目8
- eclipse字体 osgi错误Could not find bundle: org.eclipse.equinox.console
- “双调欧几里得旅行商问题”详解
- 安装CAS服务器(二)
- 在屏幕上用*输出任何长度的菱形
- 墨子怒耕柱子