【Leetcode】268. Missing Number

给定一个数组,大小为n,里面只含有0-n的数字,且不同,那么肯定有一个数字无法包含。找出这个数字。

https://leetcode.com/problems/missing-number/?tab=Description

先介绍一个运用bit操作的算法。首先下标肯定是0到n-1,值是0到n少一个,那么把下标和值一起做xor,最后再和n做xor,缺失的值只出现了一次,其余都是两次。结果就是缺失的值。利用xor操作找出现奇数次的数字。类似思路在single number中介绍过。

	public int missingNumber(int[] nums) {
		int xor = 0;
		for(int i = 0; i < nums.length; i++){
			xor = xor ^ nums[i] ^ i;
		}
		return xor^nums.length;
	}


当然还可以利用另一个方法。思路就是用值作为下标来索引数组,索引过的变为负数来记录,那么没有被索引过的就是缺失的。当然负数不是随便的负数,仍然需要记录原有的值。这里有两点需要考虑,一个是0,0的负还是0,所以负数的处理策略是先取负再-1,借鉴了java库函数的binarysearch的insertpos思路。第二个是如果有n怎么办,因为n是不能做下标的。其实遇到n直接跳过就好,因为如果有n,那么我们一定有一个数字没有遍历到,最后可以检测到,如果没有n,那么我们会索引到全部的数,这时就应该返回n。

	public int missingNumber1(int[] nums) {
	    for(int i : nums){
	    	int index = i < 0?-(i+1):i;
	    	if(index == nums.length) continue;
	    	if(nums[index] >= 0)
	    		nums[index] = -nums[index] - 1;
	    }  
	    for(int i = 0; i < nums.length; i++){
	    	if(nums[i] >= 0)
	    		return i;
	    }
	    return nums.length;
	}
这个思路在另一个遇到过: https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/?tab=Description



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值