前言
本文主要介绍如何使用位运算从一堆数中寻找出现K
次的数,这一堆数中有很多数出现了M
次,只有一个数出现了K
次,并且K
是小于M
的,另外要求额外空间复杂度为O(1),时间复杂度为O(n),那么该如何寻找出这个数呢?
例如,给出一个数组arr=[1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
,K = 2
,M = 3
。在这个数组中,只有1
这个元素出现了2
次,其他的元素都出现了3
次,现在要求使用位运算把1
这个元素找出来。
思路分析
要求额外空间复杂度为O(1),也就是说,我们只能创建有限的、固定的几个变量。
之前的几个寻找元素的题目都用到了异或运算来解决的,这个题目还能用异或运算吗?这个就不可以了,如果K
是个偶数的话,用异或就直接给干废了。
我们知道,在Java
中,int
型的二进制的长度为32
位。
如果把这个数组的所有元素都转成二进制,然后把二进制每个位置的数据相加,存放到一个长度为32位的数组中呢?
步骤
假如数组arr=[a,a,b,b,b,c,c,c,d,d,d]
,K = 2
,M = 3
,要找