美文网首页
数组中只出现一次的数字

数组中只出现一次的数字

作者: su945 | 来源:发表于2020-05-18 23:09 被阅读0次

    题目描述

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

    问题分析

    可以利用异或的性质,如果存在两个只出现一次的数字,那么异或结果一定是两个不相同数字的异或结果。

    • 这道题我们可以利用异或的特性--两个相同数字异或,结果为0。把数组中的数据全部想成二进制会更容易理解。

    • 首先我们来考虑数组中只有一个出现一次的数字的情况,这种情况下,我们直接异或数组中的所有值即可得到这个数字;接下来考虑有两个出现一次的数字的情况,这种情况下,我们可以把原来的数组分成两组,每组里面各有一个只出现一次的数字,然后运用前面的解法即可得到结果。

    • 问题的关键是如何划分成两个数组。我们呢可以根据全部值异或的结果进行思考,我们可以先把结果中最右边的1作为划分条件,然后判断数组中每个数字该位置上是不是1,如果是则为第一组,否则为第二组。这样分完之后,一组里面正好一个只出现一次的数字。

    解题思路1

    class Solution {
    public:
    
        bool isBiteOne(int data,int index)
        {
            data = data >> index;
           return (data &1);
        }
    
        void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
            if (data.size() <2)
            {
                return;
            }
            //异或计算
            int tmp = data[0];
            for(int i = 1; i < data.size(); ++i)
            {
                tmp = tmp ^ data[i];
            }
            if (tmp == 0)
            {
                return;
            }
            //记录最左边为1的位置
            int index = 0 ;
            while ((tmp & 1) == 0)
            {
                tmp = tmp >> 1 ;
                index++;
            }
            *num1=*num2=0;
            for(int i = 0; i < data.size(); ++i)
            {
                if (isBiteOne(data[i],index))
                {
                    *num1 = *num1 ^ data[i];
                }
                else
                {
                    *num2 = *num2 ^ data[i];
                }
            }
    
        }
    };
    

    相关文章

      网友评论

          本文标题:数组中只出现一次的数字

          本文链接:https://www.haomeiwen.com/subject/zpymohtx.html