算法 | 如何用位运算从一堆数中寻找出现K次的数?

前言

本文主要介绍如何使用位运算从一堆数中寻找出现K次的数,这一堆数中有很多数出现了M次,只有一个数出现了K次,并且K是小于M的,另外要求额外空间复杂度为O(1),时间复杂度为O(n),那么该如何寻找出这个数呢?

例如,给出一个数组arr=[1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]K = 2M = 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 = 2M = 3,要找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值