• 【剑指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;
        }
    };
  • 相关阅读:
    asp.net web生命周期
    图的数据结构1
    最长公共子串
    内部排序

    棋盘覆盖问题
    队列
    矩阵连乘问题
    图的数据结构2
    旅行售货员问题
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4764780.html
Copyright © 2020-2023  润新知