消失的数字-LeetCode

这篇博客介绍了如何在给定包含0到n所有整数的数组中,找出缺失的那个整数。作者提出了三种方法,包括排序后查找、计算和异或运算。其中,第三种方法利用异或的性质在O(n)时间内找到了缺失的数字,这种方法高效且简洁。博客内容涵盖了数组操作、算法思想和C语言编程实践。
摘要由CSDN通过智能技术生成

题目:

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

示例 1:

输入:[3,0,1]
输出:2

示例2:

输入:[9,6,4,2,3,5,7,0,1]
输出:8

使用C语言时LeetCode给出的模板为:

int missingNumber(int* nums, int numsSize){
}

我一共想到了三种方法,但是第一个方法的时间复杂度为O(n*log2 N):
方法一:
由于输入的内容是0-n的,但是有没有按顺序我们不知道,取决于输入的数据。可以先使用qsort函数将它们先排序,然后使用循环一个一个查找就行。
代码实现:

//方法一:排序,然后循环查找。但是时间复杂度通不过
# include <stdio.h>
# include <stdlib.h>

int cmp(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int main(void)
{
	int nums[9] = { 0 };
	//赋值
	for (int i = 0; i < 9; i++)
	{
		scanf("%d", nums + i);
	}
	//排序
	qsort(nums, 9, sizeof(nums[0]), cmp);
	int ret = missingNumber(nums, 9);
	printf("%d\n", ret);
	return 0;
}
int missingNumber(int* nums, int numsSize) 
{
	int i = 0;
	for (i = 0; i < numsSize; ++i)
	{
		//如果不匹配,则返回i.就是消失的那个数字
		if (*(nums + i) != i)
		{
			return i;
		}
	}
}

方法二:
由于是0-n的数字,少了一个m。
消失的数字 = 没有少数字之前的和 - 少了数字之后的和

//第二种方法
//消失的数字 = 没有少数字之前的和 - 少了数字之后的和
# include <stdio.h>
 
int missingNumber(int* nums, int numsSize);
 
int main(void)
{
	int nums[9] = { 0 };
	//对数组赋值
	for (int i = 0; i < 9; i++)
	{
		scanf("%d", nums + i);
	}
	int ret = missingNumber(nums, 9);
	printf("%d\n", ret);
	return 0;
}

int missingNumber(int* nums, int numsSize)
{
	int i = 0;
	int sum1 = 0;
	int sum2 = 0;
	//求出少了数字之后的和
	for (i = 0; i < numsSize; ++i)
	{
		sum1 += *(nums = i);
	}
	//求出没少之前的数字之和
	for (int i = 0; i <= numsSize; ++i)
	{
		sum2 += i;
	}
	return sum2 - sum1;
}

方法三
第三种方法采用了异或的一些性质:

假如有一个数为a和b,则:
a ^ a = 0
0 ^ a = a; //一个数和0异或得到的是本身
a ^ b ^ c = a ^ c ^ b; //可以进行交换位置·

没有少数字之前,整个数组就是0~n的数字
所以我们让没少数字之前的数组值全部异或,为什么要这样呢?
在这里插入图片描述

代码实现:

//使用异或
int missingNumber(int* nums, int numsSize) {
	int sum = 0;
	for (int i = 0; i < numsSize; i++)
	{
		sum ^= i;
		sum ^= *(nums + i);
	}
	sum ^= numsSize;
	return sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小酥诶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值