数组中数字出现的次数(leetcode简单)

此栏目用来更新在leetcode或者剑指offer上刷的题,今天是2022年4月1日,希望能坚持吧。

剑指 Offer 56 - I. 数组中数字出现的次数

一个整型数组nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

思路:(分离)

1.ret=0,将数组中所有数,跟ret都异或一下。假设出现一次的两个数分别是x和y,那么ret就是x异或y,比如x=5(0101),y=3(0011),那么ret=6(0110),这时一定有结论:ret一定不为0,因为两个不一样的数做异或,对应的位一定有不一样的地方

2.假设有数组1 3 1 2 5 2 ,找ret里面随便一个为1的位,样例中就是第一位或者是第二位(6的二进制表达是0110),所以可以假设ret的第n位为1,说明了x和y的第n位,一个为0,一个为1,基于此,可以将原数组中的数,第n位为1的分成一组,第n位为0的分成另外一组

3.继续使用该假设数组,设n=1,则这一组为2 2 3 ,另外一组是1 1 5,分别对这两组进行异或,这样结果就出来了。

上代码

剑指 Offer 56 - II. 数组中数字出现的次数 II

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

思路:(直接计数)

首先拿数来举例子比如 3 3 3 4,3是0011,4是0100。

1.统计出数组中所有的数,从低到高,第0位合计有多少个1,第1位合计有多少1,.......第31位合计
有多少个1。上面的3 3 3 4 统计结果为第0位和第1位出现3个1,第2位出现1个1,那么可以得出这样的结论,如果某一个数出现3次,那么对应的位出现1的次数为3的倍数!

2.0-31位统计出现1的个数去%3,找出余数为1的那些位 ,这些位的组合就是出现一次的这个数

3.这些位找到后,假设是第j位,那就用1左移j位去还原。

代码就不贴了,可以去leetcode题解中看看。或者过几天把这个帖子更新一下。


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值