牛客题解官 level
获赞
1.5W
粉丝
96.2W
关注
2
看过 TA
6108
清华大学
2019
Java
IP属地:上海
牛客题解小达人~
私信
关注
2020-06-01 14:50
清华大学 Java
描述 这是一篇针对初学者的题解,共用两种方法解决。知识点:数组,位运算,哈希难度:一星 题解 题目抽象:给定一个数组,数组中只有2个数字出现了一次,其余都出现了2次,找出这2个数字。 方法一:哈希法 很显然的方法,遍历一遍数组,用map记录出现的次数,然后再遍历一遍数组,找出出现1次的数字。 代码 class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { unordered_map<int, int> mp; ...
大数据的菜鸟:答案解释里说的模棱两可的,首先应该是 ret&(-ret),该运算的目的时为了找到两个数字的二进制位中第一个不相同二进制位,然后根据这个位置进行分组, ret&(-ret)也可以理解为 mask=1,while(ret&mask==0)mask<<=1。然后根据这个位置,在第二次进行for循环的时候,将原数组所有的元素根据i位置的不同进行分组并进行异或运算,由于其他的数字出现两次所以异或的二进制位结果会抵消掉,即n^n=0,所以最后的结果为我们要求的其中一个数num1^0=num1 [这里的0即为其他进入该分组且重复2次的数字异或的最后结果n^n^m^m....=0,并且无视元素顺序,结果都一样,可通过写demo证实],所以通过if-else进行分两组后求出我们需要的答案。
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务