• 【剑指offer】面试题40:数组中只出现一次的数字


    题目:

    一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

    思路:

    因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res中其中至少1bit不是0,我们根据这个bit是否为0把数组分为两组,两个只出现一次的数字肯定在不同的组。其他出现两次的数组两个肯定在相同组,而两个相同的数组异或之后是0,任意一个数字与0异或还是该数字本身。

    代码:

    class Solution {
    public:
        void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
            if(data.size()<=1)  return;
            
            int res=data[0];
            for(int i=1;i<data.size();++i)
                res=res^data[i];
            
            int k=find1Index(res);
            
            *num1=0;
            *num2=0;
            for(int i=0;i<data.size();++i)
            {
                if(kBitIs1(data[i],k))
                    *num1=(*num1)^data[i];
                else
                    *num2=(*num2)^data[i];
            }
            
        }
    private:
        bool kBitIs1(int num, int k)
        {
            return ((num>>k)&1)!=0;
        }
        
        int find1Index(int num)
        {//找最右边的1的位数
            int k=-1;
            while(num)
            {
                ++k;
                if(num&1)
                {
                    //++k;这句应该不管if-else都要执行才对
                    return k;
                }
                else
                    num=num>>1;//不能只写成num>>1;
            }
            return k;
        }
    };
  • 相关阅读:
    linux expr命令执行问题
    Virtual Box设置Host only模式的网络互通问题
    Linux下管理软件的方法
    转载 AMI方案和Insyde方案
    笔记二(名词详解)持续更新。。。
    笔记一(固件、BIOS、UEFI)
    Cache As Ram
    (二十四)C语言之文件
    (二十三)C语言之位运算
    (二十二)C语言之typedef
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4764780.html
Copyright © 2020-2023  润新知