1.寻找消失的数字 2.寻找没有重复出现的数字

1.寻找消失的数字

要求:有一组数据0到n的数字,但其中少了一个数字要求写一个程序找出这个数字并且时间复杂度为o(n)比如:0,1,2,3,4,5,7,8,9这组数据缺少了一个6,要求我们设计个程序把它找出来。

思路:因为限制了时间复杂度且题目与数字相关,因此我们可以想到位操作符,我们知道0与任何数异或都是任何数,如果我们用0与缺失数字的那个数组异或一遍,再用得到的值与没有缺失的异或一遍那我们得到的就是那个缺失的值。

代码实现:

int index(int* arr, int numsize)//寻找消失的数字,时间复杂度为f(n)
{
	int x = 0;
	for (int i = 0; i < numsize; i++)x ^= arr[i];//0与任何数异或都是任何数,相同的数异或为0;
	for (int i = 0; i <= numsize; i++)x ^= i;//因此可以通过异或的操作得到缺失的数
	return x;
}
int main()
{
	int arr1[] = { 0,1,2,3,4,5,7,8,9 };
	printf("%d ", index(arr1, 9));
return 0;}

2.寻找没有重复出现的数字

要求:在一组数据中,其他数都出现了2次但只有2个数只出现过一次,比如:1,2,3,4,5,6,7,8,9,1,2,3,5,6,8,9一组数字中只有4,7出现过一次,要求我们设计个程序把它两找出来,并且要求时间复杂度为O(n)空间复杂度为O(1)

思路:(设要找的值为X1,X2)同上一样,限制了时间复杂度和空间复杂度,且与数字的操作有关,因此我们可以考虑位操作符,我们知道知道0与任何数异或为任何数,相同的数字异或一次则就是0,所以我们可以把数据中所有数字异或一遍则得到的就是只出现一次的数字的异或值x,而接下来要做的就是将x分离从而得到我们要找的值,我们知道异或就是相异为1相同为0,所以在x上是1的位在x1,x2上一个是1一个是0所以我们可以将x1和x2分离(找到x上一个位为1的位置)再将所有数据异或就可以得到x1,x2.(如何找到一个1的位置:对1运用移位操作符<<且与x按位与(同为1则是1,否则都是0)当不为0时则说明找到了1)

代码实现:

int* insert(int* arr, int numsize)//寻找一组数据中2个只出现一次的数字
{
	int x = 0;
	for (int j = 0; j < numsize; j++)x ^= arr[j];//因为相同的数异或为0,0与任何数异或为任何数
	//因此x拿到的是只出现1次的两个数的异或
	//分离
	int m = 1;
	while(m<=32)
	{
		if (x & 1 << m)//找到x中从右边的第一个1
			break;
		else m++;
	}
	int x1 = 0, x2 = 0;
	for (int i = 0; i < numsize; i++)//因为异或相异为1,相同为0,因此x中为1的位x1和x2而言一个为1,一个为0
	{//因此可以通过移位操作符找到第一个为1的位置,然后通过循环找到数据中那个位为1和为0的所有数据并分开与x1,x2
		//异或就可以得到只出现一次的数
		if (arr[i] & 1 << m)
		{
			x1 ^= arr[i];
		}
		else
		{
			x2 ^= arr[i];
		}
	}
	int* value = (int*)malloc(2 * 4);
	value[0] = x1;
	value[1] = x2;
	return value;

}
int main()
{
	int arr2[] = {1,2,3,4,5,6,7,8,9,1,2,3,5,6,8,9};
	int*x=insert(arr2, 16);
	printf("%d %d", x[0], x[1]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abstract man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值