整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?

整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?


int singleNumber(int arr[], int n)
{
	printf("n = %d\n",n);
	int result = 0;
	for(int i=0; i < n; i++)
	{
		result ^= arr[i];
	}

	return result;
}


 下面是用c语言实现的方法:

#include<stdio.h>
#include<string.h>

int singleNumber(int arr[], int n)
{
	int result = 0;
	for(int i=0; i < n; i++)
	{
		result ^= arr[i];
	}

	return result;
}

void main()
{
	int arr[5];
	int single_Num ;
	printf("please input array number:\n");
	for(int i = 0; i < 5; i++)
		scanf("%d", &arr[i]);
	for(i = 0; i < 5; i++)
		printf("arr[%d]=%d \n",i, arr[i]);
	
	single_Num = singleNumber(arr, 5);

	printf("single number is:%d\n",single_Num);
}

如果是每个元素均出现k次的话,除了一个元素例外,如何找出这个元素?

考虑每个元素的为一个32位的二进制数,这样每一位上出现要么为1 ,要么为0。对数组,统计每一位上1 出现的次数count,必定是kN或者kN+1 次。让count对k取模,能够获得到那个只出现1次的元素该位是0还是1。

例如k等于3的时候,实现方法如下:

int singleNumber(int arr[], int n)
{
	int result = 0;
	for(int i = 0; i < 32; i++)
	{
		int count = 0;
		int mask = 1 << i;

		for(int j = 0; j < n; j++)
		{
			if(arr[j] & mask)
			{
				count++;
			}
		}

		if(count % 3)
		{
			result |= mask;
		}
	}

	return result;
}


网上还有其他的一种算法可以进行参考:

int singleNumber(int A[], int n)  
{  
    int one = 0, two = 0;  
    for (int i = 0; i < n; i++)  
    {  
        two |= A[i] & one;  
        one ^= A[i];  
        int three = one & two;  
        one &= ~three;  
        two &= ~three;  
    }  
    return one;  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值