56Ⅰ.数组中数字出现的次数
大约 1 分钟
56Ⅰ.数组中数字出现的次数
参考链接
剑指 Offer 56 – I. 数组中数字出现的次数-跟着帅地玩转校招,刷爆各类算法题帅地玩Offer
优秀题解
class Solution {
public int[] sockCollocation(int[] sockets) {
int x = 0, y = 0, n = 0, m = 1;
for(int num : sockets) // 1. 遍历异或
n ^= num;
while((n & m) == 0) // 2. 循环左移,计算 m
m <<= 1;
for(int num: sockets) { // 3. 遍历 sockets 分组
if((num & m) != 0) x ^= num; // 4. 当 num & m != 0
else y ^= num; // 4. 当 num & m == 0
}
return new int[] {x, y}; // 5. 返回出现一次的数字
}
}
作者:Krahets
链接:https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solutions/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
个人理解:
前提:两个相同数字 异或 结果为0
1、异或操作,遍历数组,获得 两个不相同数字的 异或结果
2、通过 异或结果,循环执行 按位与 操作获得第一个不相同的二进制位
3、根据第一个不相同的二进制位,来区分两个不同数字,并且将 数组 分两个子数组,遍历数组执行 按位异或 操作,子数组各自找出其中的不重复数字