leetcode:268. Missing Number

版权声明:hiahiahia~ 打劫来的原创!!未经允许可随便转载。喜欢就拿去。最喜欢的极客信条:【May you do good and not evil. May you find forgiveness for yourself and forgive others. May you share freely,never taking more than you give.】此博仅为本菜鸟的草稿本! https://blog.csdn.net/hunter___/article/details/90203326

思路:

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.

猜你喜欢

转载自blog.csdn.net/hunter___/article/details/90203326