问题描述: 一个整型数组里除了一个数字之外, 其他数字都出现了两次。找出这个只出现1 次的数字。要求时间复杂度是O(n), 空间复杂度是O(1)。

用异或满足交换律来做这道题目:

System.out.println(4 ^ 7);// 3
System.out.println(4 ^ 7 ^ 4);// 7
System.out.println(4 ^ 7 ^ 4 ^ 7);// 0

当两个数相同的时候,异或操作得到0

故解此题的代码为:

	public static void method(int[] a) {
		int res = a[0];
		for (int i = 1; i < a.length; i++) {
			res ^= a[i];
		}
		System.out.println("只出现一次的数为:" + res);//5
	}

	public static void main(String[] args) {
		int[] a = { 1, 2, 3, 2, 4, 3, 5, 4, 1 };
		method(a);
	}

但是这种方法只适用于,其他数出现的次数为偶数次的情况,如果其他每个数都出现n次(n可以是奇数也可以是偶数),该如果找出只出现一次的那个数呢?

方法如下:


我们建立一个长度为32的数组bit,bit[i]储存的是a数组中,所有数第i位上为1的总个数。(位数是从右往左数的,最右边是第0位)

我们将bit数组中的每一个数除以3,如果除不尽,说明我们最终要找的那个数在这个位上为1

	public static int method(int[] a) {
		int[] bit = new int[32];
		int len = a.length;
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < bit.length; j++) {
				bit[j] += ((a[i] >> j) & 1);
			}
		}
		int res = 0;
		for (int i = 0; i < bit.length; i++) {
			if (bit[i] % 3 != 0) {
				res += (1 << i);
			}
		}

		return res;
	}

	public static void main(String[] args) {
		int[] a = { 1, 2, 1, 2, 4, 2, 4, 4, 1, 3 };
		System.out.println(method(a));// 3
	}



版权声明:本文为Mason97原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Mason97/article/details/104560223