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)了。