亦或思想解决问题--数组中数字出现的次数
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了亦或思想解决问题--数组中数字出现的次数相关的知识,希望对你有一定的参考价值。
问题描述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
分析:
利用亦或相异为1相同为0可以把重复的数消去
- 但是剩下两个数,此时我们将两个数抑或,利用1进行移位操作,找到找到两数亦或后的数字 第一个为1(
两个数的区别点,可以把数组分为各包含一个数字两部分
)的位,记录下来- 利用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;
}
以上是关于亦或思想解决问题--数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章