亦或思想解决问题--数组中数字出现的次数

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了亦或思想解决问题--数组中数字出现的次数相关的知识,希望对你有一定的参考价值。

力扣链接

问题描述

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。


输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

分析:

  1. 利用亦或相异为1相同为0可以把重复的数消去
  2. 但是剩下两个数,此时我们将两个数抑或,利用1进行移位操作,找到找到两数亦或后的数字 第一个为1(两个数的区别点,可以把数组分为各包含一个数字两部分)的位,记录下来
  3. 利用2中找到的位置为标识 用if判断分组亦或,分别得到的结果就是这两个数

代码如下:

int* singleNumbers(int* nums, int numsSize, int* returnSize){
    int position=0;
    int x=0;
    int i=0;
    int* arr=(int *)malloc(sizeof(int)*2);
    for(i=0;i<numsSize;i++)//两数亦或
    {
        x^=nums[i];
    }
    for(i=0;i<32;i++)//找出相异的位
    {
        if((x>>i) & 1 == 1)
        {
            position=i;
            break;
        }
    }
    int x1=0;
    int x2=0;
    for(i=0;i<numsSize;i++)//分两组亦或
    {
        if((nums[i] >> position) & 1 == 1)
        {
            x1^=nums[i];
        }
        else
        {
            x2^=nums[i];
        }
    }
    arr[0]=x1;
    arr[1]=x2;
    *returnSize=2;
    return arr;
}

以上是关于亦或思想解决问题--数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

数组中出现次数超过一半的数字

数组中有一个数字出现次数超过数组长度一半,找出这个数字(用C语言解决)。要求时间复杂度尽量小。

剑指Offer-数字在排序数组中出现的次数

数组中数字出现的次数

数组中数字出现的次数

数组中数字出现的次数