• 神奇的亦或


     一、一个整数数组,只有唯一一个元素出现一次,其他的元素都出现两次,找出这个元素。

      解析:根据a^a=0,只需将所有的元素亦或起来,得到的结果就是该元素。以LeetCode 136.为例,代码如下:

      

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int ans=0;
            for(int i=0;i<nums.size();++i)
                ans^=nums[i];
            return ans;
        }
    };
    

    二、一个整数数组,有两个不同的元素各出现一次,其他元素均出现两次,找出这两个元素。

      解析:设要求的两个元素为x、y。将所有元素的亦或起来,便得到这两个元素的亦或运算值,并且这个值一定不是0,即,在某位比特位(假设第k位)上值是1。所以根据第k位上的值将数组中的元素分成两部分,分别亦或起来得到的两个值便是x和y的值。以LeetCode 260.为例,代码如下:

      

    class Solution {
    public:
        vector<int> singleNumber(vector<int>& nums) {
            vector<int>ans;
            int a=0;
            for(int i=0;i<nums.size();++i)
                a^=nums[i];
            a=a^(a&(a-1));
            int x=0,y=0;
            for(int i=0;i<nums.size();++i)
                if(nums[i]&a) x^=nums[i];
                else y^=nums[i];
            ans.push_back(x);
            ans.push_back(y);
            return ans;
        }
    };
    

      

    三、有一个长度为n+1的数组,其中的元素是0~n这n+1个数。现在,这个数组中丢失了一个元素,请找回这个元素。

      解析:这道题太简单了。。。以LeetCode 268.为例,代码如下:

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            int xor1=0;
            for(int i=0;i<nums.size();++i)
                xor1^=nums[i]^(i+1);
            return xor1;
        }
    };
    

      

    四、一个整数数组中,只有元素x出现一次,其他元素均出现三次,找到这个元素。

      解析:对于32位以内的每一个整数,这32个比特位构成的0-1组合是唯一的。所以,当某个数出现三次,那么他的每一比特位上的数字累加和应为3的倍数,所以将所有数的数位上的值累加起来,如果哪一位上的和模3等于1,那么x就在这一位上取值。以LeetCode 137.为例,代码如下:

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int *a=new int[32];
            fill(a,a+32,0);
            for(int i=0;i<nums.size();++i)
                for(int j=0;j<32;++j)  if(nums[i]&(1<<j))
                    ++a[j];
            int ans=0;
            for(int i=0;i<32;++i)
                if(a[i]%3) ans|=(1<<i);
            delete []a;
            return ans;
        }
    };
    

      这是一个通法,如果其他元素出现次数是其他的值,这种方法依然有用!!!

  • 相关阅读:
    git 问题集
    es7集群安装配置及常用命令
    idea maven项目操作kafka--生产者和消费者
    linux中kafka集群搭建及常用命令
    xampp 支持php版本,支持php5.2的最后一版xampp——xampp-1.7.1
    TCP和UDP的区别及各自优缺点区别
    Qt容器(QHash/QMap等)基本学习记录
    linux系统剪切
    简单网络IP探索
    C++(Qt)线程与锁
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5178735.html
Copyright © 2020-2023  润新知