题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1).
分析:
由于限制了复杂度,所以要用异或运算来解,什么是异或?
首先,计算机1个字节是8位(1Byte=8bit);其次,异或运算是:两个输入相同时为0,不同则为1。
举例数组:
{2, 4, 3, 6, 3, 2, 5, 5}
核心思路:
1、数组中全部数据异或操作后,依次对数组中的每个元素进行异或(相同位为0,不同为1)操作,得到0000 0010。
2、倒数第二位是1,说明我们要找的那两个只出现一次的数字,倒数第二位是不同的。
3、下面根据每个数二进制倒数第二位是不是1来分成两组,倒数第二位为1的是{2, 3, 6, 3, 2},倒数第二位为0的是{4, 5, 5}。
4、接下来对这两个数组分别进行异或操作,剩下的数字就是只出现一次的数字。
代码:
public class FindOnceNum {
public void find(int[] values) {
if (Objects.isNull(values) || values.length < 2) {
throw new RuntimeException("参数不正确&