此栏目用来更新在leetcode或者剑指offer上刷的题,今天是2022年4月1日,希望能坚持吧。
一个整型数组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题解中看看。或者过几天把这个帖子更新一下。