剑指 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的两个数字(

剑指Offer打卡56-II. 数组中数字出现的次数 II