[剑指offer] 40. 数组中只出现一次的数字

Posted ruoh3kou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer] 40. 数组中只出现一次的数字相关的知识,希望对你有一定的参考价值。

题目描述

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

思路:
解法一:
哈希表
class Solution
{
  public:
    void FindNumsAppearOnce(vector<int> data, int *num1, int *num2)
    {
        map<int, int> mapping;
        for (int i = 0; i < data.size(); i++)
            mapping[data[i]]++;
        vector<int> v;
        for (int i = 0; i < data.size(); i++)
        {
            if (mapping[data[i]] == 1)
                v.push_back(data[i]);
        }
        *num1 = v[0];
        *num2 = v[1];
    }
};

解法二:

利用异或

1、异或思想,一个数与自己异或为0,一个数与0异或为自己
2、由于其它数字两两相同,所以所有数异或则得到这两个不同数的异或结果。取这个结果的第一个1作为标志位
3、这个标志的1,必须是:这两个数在该位一个为0,一个为1
4、这样可以将数组分为两组,一组在该标志位为1,一组在该标志位为0,这两个不同数字分别在这两组内
5、将两组内的数分别异或,得到两个结果则为这两个不同的数
class Solution
{
  public:
    void FindNumsAppearOnce(vector<int> data, int *num1, int *num2)
    {
        int tempbit = 0;
        for (auto c : data)
            tempbit ^= c;
        int sign = 0; //记录两个数不同的那一位

        for (; sign < data.size(); sign++)
        {
            if ((tempbit & (1 << sign)) != 0)
                break;
        }
        *num1 = 0;
        *num2 = 0;
        for (auto c : data)
        {
            if ((c & (1 << sign)) == 0)
                *num1 ^= c;
            else
                *num2 ^= c;
        }
    }
};

 

 

以上是关于[剑指offer] 40. 数组中只出现一次的数字的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》:[40]数组中只出现一次的数字

剑指Offer40数组中只出现一次的数字

剑指offer 40.知识迁移能力 数组中只出现一次的数字

剑指Offer40:数组中只出现一次的数字(Java)

剑指OFFER 数组中只出现一次的数字

《剑指Offer——数组中只出现一次的两个数字,数组中唯一只出现一次的数字》代码