思路:
1.先加进map,
2.第二遍循环缺的
class Solution {
public:
int missingNumber(vector<int>& nums) {
int len=nums.size();
if(len==0) return 0;
map<int,int> mp;
for(auto i=0;i<nums.size();i++)
{
mp.insert(pair<int,int> (nums[i],0));
auto it=mp.find(nums[i]);
printf("----%d ,%d \n",(*it).first,(*it).second);
}
for(auto v : mp){
printf("%d ,%d \n",v.first,v.second);
}
int inorder=0;
for(auto i=0;i<nums.size();i++){
if( mp.count(i) == 0) return i;
inorder=i+1;//travel to end of nums,we need to add i+1 into nums
}
return inorder;//if []
}
};
太慢了。。。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int len=nums.size();
if(len==0) return 0;//if []
map<int,int> mp;
for(auto i=0;i<len;i++) mp.insert(pair<int,int> (nums[i],0));
int inorder=0;//nums inorder
for(auto i=0;i<len;i++){
if( mp.count(i) == 0) return i;
inorder=i+1;//travel to end of nums,we need to add i+1 into nums
}
return inorder;
}
};
我想想看,,,
数组怎么做?
排序了再比较:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int len=nums.size();
if(len==0) return 0;//if []
sort(nums.begin(),nums.end());
int inorder=0;//nums inorder
for(auto i=0;i<len;i++)
{
if(nums[i] != i) return i;
if(i==len-1) inorder=i+1;//else get the end ,nums inorder
}
return inorder;
}
};
依然很慢
大佬的:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int result = nums.size();
int i=0;
for(int num:nums){
result ^= num;
result ^= i;
i++;
}
return result;
}
};
解释:
To summarize terbb's comment: if i is the missing number, and ^ represents XOR, we have:
(0^0) ^ (1^1) ^ ... ^ (i) ^ ... ^ (N^N) = 0 ^ 0 ^... ^ i ^ ...^ 0 = i
For people who don't understand this solution: what he's doing is he's using the bitwise XOR operator to single out the missing number. How? First, we need to understand the properties of XOR: firstly, XOR'ing a number by itself results in 0. So if we have 1 ^ 1, this will equal 0. Secondly, XOR is commutative and associative - what this means is we can re-order our XOR operations in any way we want and it will result in the same value we would have if we didn't. Finally, a number XOR'd by 0 will result in the same number unchanged. So, essentially, by XOR'ing all the numbers from 0 to n, and all the numbers in the array, we will end up XOR'ing 2 of every number except for the missing one.
As we know, it doesn't matter which order we XOR these numbers in - as long as we XOR 2 of the same number, it will result in 0. So eventually we will get 0 ^ the missing number, which, due to the third property I mentioned, will simply equal the missing number. If you're not convinced as to how these properties work, I would recommend taking a quick look as to how they work.