⭐️ 题目描述
🌟 leetcode链接:数组中数字出现的次数
⭕️ 代码:
/*
思路:有两个出现单次的数字,其余数字都出现两次。把所有的数字分成两组,这两个数组分到不同的组,
异或起来,就可以得到这两个出现一次数。
例:[4 , 1 , 4 , 6]
第一步:整体异或 4 ^ 4 = 0 最后结果就是 1 ^ 6
00000001
00000110
00000111 1 ^ 6的结果是这两个出现一次数的不同位
第二步:按这两个数任意不同位分组异或即可。
比如:按所有数异或完的结果最低位的 1 分组,
这两个出现一次数肯定不在一个组里(异或特点:相同为0,相异为1)
用 pos 记录右移几位异或结果是 1
第三步:只需要把所有数按 pos 右移是 1 的异或起来 , 是 0 的异或起来。即可得到两个出现一次的数。
*/
int* singleNumbers(int* nums, int numsSize, int* returnSize){
*returnSize = 2;
int * res = (int*)calloc(*returnSize , sizeof(int));
// 全部数字异或一遍
int xor = 0;
for (int i = 0; i < numsSize; i++) {
xor ^= nums[i];
}
// 00000001
// 00000110
// 00000111 要找的两个数字的不同位
// 按其中一个1分组
int pos = 0;
for (int i = 0; i < 32; i++) {
if ((xor >> i & 1) == 1) {
pos = i;
break;
}
}
for (int i = 0; i < numsSize; i++) {
if ((nums[i] >> pos & 1) == 1) {
res[0] ^= nums[i];
} else {
res[1] ^= nums[i];
}
}
return res;
}