Given an array containingn distinct numbers taken from0, 1, 2, ..., n, find the one that is missing from the array.
For example,
Givennums =[0, 1, 3] return2.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
这道题是给出一组特殊的数字,找出其中缺少的那一个,题目难度为Medium。
由于数组的特殊性,我们很容易计算出不缺少数字的情况下整个数组中数字的和。然后遍历数组,依次减掉各个数字,最后剩下的就是缺少的那一个。具体代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sz = nums.size();
long long sum = sz * (sz + 1) / 2;
for(auto num:nums) {
sum -= num;
}
return sum;
}
};
这么做可以完成这道题,不过这貌似不是题目想要的答案。。好吧,我们知道每个数异或自己会得到0,而异或0之后不变,这样我们遍历数组,异或所有的数字,同时异或1到n,得到的数字就是缺少的那一个。异或1到n可以用数组的下标来处理。具体代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sz = nums.size();
int num = 0;
for(int i=0; i<sz; i++) {
num ^= nums[i]^i;
}
return num^sz;
}
};