LeetCode消失的数字(三种解法详解)

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

函数接口如下

int missingNumber(int* nums, int numsSize){

}

其中nums为指向数组首元素的指针,numsSize为数组大小。

方法一:位运算

利用位运算中的异或,异或的位运算规则是,1^1=0,1^0=1,0^0=0,从这里能看出,异或的运算能找出两个数中不相同的位并标为1,比如两个相同的数它们的位是相同的异或为0,x^x=0,与0异或的数能得到数本身x^0=x

回到这个题目,要想找出缺失的那个数就很简单了,定义一个变量val让它与数组中的这些数做位运算异或的累积,再和完整的0-N的所有整数进行异或,对于val来说,每一个位的累积效果就是两个相同的数的那个位的异或(相同的数那个位也相同异或出来为0),还有和那个缺少了的数的位的异或。最后得到的所有位其实就是缺少了的那个数的所有位,也就找到了缺少了的那个数。

int missingNumber(int* nums, int numsSize){
    int val = 0, i;
	for (i = 0; i <= numsSize; i++)
	{
		val ^= i;
	}
	for (i = 0; i<numsSize; i++)
	{
		val ^= nums[i];
	}
	return val;
}

还要注意循环边界不要写错。

方法二:求和相减

此方法思想比较简单,即把所有0-N的数相加,再减去数组中的所有数,得到的结果就是缺失的那个数,不过此方法有运算溢出风险,而方法一直接对位进行操作,是不会有溢出风险的。

方法三:桶式排序

即额外请求一块大小为N+1的数组空间用作桶,每个数组元素的下标既是桶的标号,将桶里装的数全部初始化为-1。访问原数组中的元素,元素值为多少就放到标号为多少的桶里面,全部访问之后在遍历0到N+1的桶,找到值为-1的桶说明没有元素值被放进来,所以这个元素就是缺少的元素,而缺少的元素值即桶的标号也即是数组下标,返回此下标即可。

int missingNumber(int* nums, int numsSize){
	int* arr=(int*)malloc((numsSize+1)*sizeof(int));
    int i,tmp;
	for (i = 0; i<numsSize + 1; i++)
	{
		arr[i] = -1;
	}
	for (i = 0; i<numsSize; i++)
	{
		tmp = nums[i];
		arr[tmp] = tmp;
	}
	for (i = 0; i<numsSize + 1; i++)
	{
		if (arr[i] == -1)
		{
			return i;
		}
	}
	return -1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值