剑指 Offer 56 - 中等 - 数组中数字出现的次数
Posted .阿Q.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 56 - 中等 - 数组中数字出现的次数相关的知识,希望对你有一定的参考价值。
力扣题解思路:
想到了异或运算,但是没有想到怎么最后把两个数分开emmmmmmmmm.........................
AC代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumbers(int* nums, int numsSize, int* returnSize)
int ret = 0;
int i = 0;
int num1 = 0;
int num2 = 0;
int pos = 0;
int *arr = (int *)malloc(2 * sizeof(int));//要动态开辟内存空间存储返回值,返回类型为int*,不能使用临时数组
//通过0对自身依次异或,将两个单独的数的异或后的结果找出,再通过结果将两个值分离开来
for(i = 0; i < numsSize; i++)
ret ^= nums[i];
//找到异或后结果的二进制序列,找出为1的位数(如果为1,则说明两个单独数在这个位不相同,可凭此将两个数分离)
for(i = 0; i < 32; i++)
if((ret>>i) & 1 == 1)
pos = i;
break;
//找到位数后,将按其他数的这个位数是否为1,还是为0分离,这就形成了两组数
//各带一个单独数
//在分别自身异或,最后剩下的就是单独数
for(i = 0; i < numsSize; i++)
if((nums[i] >> pos) & 1 == 1)
num1 ^= nums[i];
else
num2 ^= nums[i];
arr[0] = num1;
arr[1] = num2;
*returnSize = 2;
return arr;
以上是关于剑指 Offer 56 - 中等 - 数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章
leetcode中等剑指 Offer 56 数组中数字出现的次数
leetcode中等剑指 Offer 56 数组中数字出现的次数
每日一题 - 剑指 Offer 56 - I. 数组中数字出现的次数
LeetCode一个整型数组里除两个数字之外,其他数字都出现了两次,请找出这两个只出现一次的数字(剑指 Offer 56 - I. 数组中数字出现的次数) | 数组分组异或
1787. 使所有区间的异或结果为零 / 剑指Offer56 - I. 数组中数字出现的次数 / 剑指Offer56 - II. 数组中数字出现的次数 II / 剑指Offer57.和为s的两个数字(