1. 程式人生 > >[劍指offer] 40. 陣列中只出現一次的數字

[劍指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; } } };