Missing Number--^异或位运算--leetcode

Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3] return 2.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
题意:
一个正确的数组,包含n个不同的数,现在给你一个少了一个数的数组,求出少了的那个数。要求:时间复杂度O(n),空间复杂度就是变量个数恒定。
怎么说呢,这题乍一看还真以为它在说0到n里面少了一个数,算出来就好了,同意的+1,T-T,T-T,T-T。
这道题用到了异或^这个运算,意思是a和b相等,异或结果为0,a和b不等结果就不为零。如果数组是完整的,当数组中的数依次从0开始一直到n异或一遍,结果应该为零;如果数组缺少一个数,当异或到n-1位(不完整数组的最后一位)数时,再与n异或之后的结果num,结果(num)应该是缺少的那位数,因为此时再与缺少的那个数异或结果必须为0,而我们根据异或运算法则可知相等的数运算结果为0,所以结果就这么出来了,有木有觉得真的是醉了。。。

public class Solution {
    public int missingNumber(int[] nums) {
        int i,num = 0 ^ nums[0],len = nums.length;
        for(i = 1; i < len; i++){
            num ^= i ^ nums[i];
        }
        return num ^ i;
    }
}

这里额外一提另一种做法:
将缺了个数的数组看成一组乱序的等差数列,等差数列求和,就是把数组里的数求和,得出Sn-1,而完整数组的和就是1到n的和Sn=n*(n+1)/2,
那么缺的那个数出来了,就是(Sn-Sn-1)了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值