⭐️ 题目描述
🌟 leetcode链接:数组中数字出现的次数
⭕️ 代码:
/*思路:有两个出现单次的数字,其余数字都出现两次。把所有的数字分成两组,这两个数组分到不同的组,异或起来,就可以得到这两个出现一次数。例:[4 , 1 , 4 , 6]第一步:整体异或 4 ^ 4 = 0 最后结果就是 1 ^ 6000000010000011000000111 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;}