数据结构时间复杂度面试题

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

示例1

{0,3,1}
输出 [2]

示例2

{9,8,5,0,1,4,7,3,6}
输出 [2]

本题思路:
这个题如果不考虑时间复杂度可以先排序,再用另一个有序且跟它缺少那个数字前的数据一样的数组,让相同下标的数相异或,如果两个异或不为0就直接返回那个有序的数组的数据,它就是数组缺少的数。
现在考虑时间复杂度我们完全可以把数组的所有数据和下标异或在一起最后剩下的便是数组缺少的数;

原理:
0和任何数异或都是那个数本身,同样两个数相异或都是0。

#include<stdio.h>
int missingNumber(int* n, int m) {
	int ret = 0;
	//这里实现所有数据和下标异或在一起
	//如果这里改成i<=m数组就会越界
	//但是这样就缺少和m这个下标相异或了
	for (int i = 0; i < m; i++) {
		ret ^= i;
		ret ^= n[i];
	}
	//数组本来只有m-1个数,没算缺少的数字。
	//里面也包括m这个数,如果只异或到下标m-1
	//最后就剩下缺少那个数和m相异或的数了
	ret^=m;
	return ret;
}
int main() {
	int arr[] = {3,0,1};
	int num = sizeof(arr) / sizeof(int);
	int m = missingNumber(arr, num);
	printf("%d", m);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

自首的小偷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值