LeetCode- 数组中数字出现的次数(单身狗问题)
题目要求
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。
方法:
由于其他数都出现两遍,把这些数异或在一起,结果为 0->,所以数组中所有元素异或起来,实际是两个单身狗异或的结果记为 ret
由于两个单身狗不相同,所有异或的结果至少有 1 个比特位为 1 (异或特点:对应比特位,相同为 0,不同为 1)
所以可以对 ret 逐位判断,找到为 1 的比特位所在的位置进行分组。pos:两个比特位不同的位置(即异或的结果对应的比特位为 1 的位置:可任意位置,只要对应比特位为 1 即可)
把数组中所有元素的 pos 位为 1 的放在一组,把 pos 位为 0 的放在另一组。认为最低位是第 0 位
图解
选择二进制序列中的哪一个比特位为 1 进行分组没有关系,只要是选择异或结果的二进制序列中某一位为 1 的进行分组即可
代码
>> 左移 << 右移
leetcode 题目:
链接:剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode) (leetcode-cn.com)
函数接口:
思路和上面的基本一致,但是要注意,这个题目要重新开辟一个空间用来保存两个单身狗,所以数组只需开辟两个大小的空间即可。
题目已经明确说明,动态开辟的数组不用我们释放,由调用者自己释放。所以我们只需要返回该数组的起始地址即可!!
注意点:动态开辟的数组的元素最初要初始化为 0,否则最初动态开辟的数组的两个元素都是随机值,这样进行分组异或的话就会出错
->为数组元素初始化可以使用:直接使用下标初始化:
e.g. arr[0] = 0 arr[1] = 0
也可以使用 memeset()函数进行初始化!
好了,今天就到这儿吧,欢迎大佬们点赞、收藏、评论呀!笔者水平有限,欢迎各位大佬批评指正!再次感谢!
版权声明: 本文为 InfoQ 作者【芒果酱】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb0920eae9b11548ccb944538】。文章转载请联系作者。
评论