一堆數裡邊只有乙個出現奇數次的數,其他都出現偶數次

2021-08-28 23:05:36 字數 420 閱讀 3508

這是我們乙個學長出的一道題,說一堆數裡邊只有乙個出現奇數次的數,其他都出現偶數次

讓你用時間複雜度為on的演算法找出這個數。

我看到的乙個簡單的方法是:

開始定義乙個a=0,每輸入乙個數就跟a異或,即a=a^n(假設輸入數的變數是n),這樣最後得到的a就是出現奇數次的那個數

仔細想想確實是這樣,異或——相同為0,不同為1,注意這個相同和不同是在二進位制的層面上來看的,是二進位制數的按位異或,

比如2,1,2這三個數,

2^1=00000010^00000001=00000011

轉換成十進位制就是3

然後3再和2異或就是

3^2=00000011^00000010=00000001,也就是十進位制1,是不是很神奇

如果對這個理解了,就有思考題了,如果是有兩個出現奇數次的數怎麼辦?三個呢?

找2個出現奇數次的數

首先乙個基礎的題就是給你乙個序列,然後這個序列的只有乙個數出現奇數次,其餘數都出現偶數次,找到那個出現奇數的數。最直接的做法就是直接開個vis陣列來存一下,然後vis 當前數 最後for一次找一下就是了,資料大直接卡你,但還有乙個更簡單的方法,就是直接把所有的數異或出來就是最終的答案。int ans...

從乙個陣列中尋找出現奇數次的數字

假設給定了陣列nums為 0,1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,1,2,3,3,0 其中3出現了3次 而其他數字都出現了兩次 則我們應該得到結果為3 第一種方式 使用hash 1 2 使用hash3 4public static int singlenumber...

判斷乙個數是否只有乙個峰值

這裡所提及的峰值問題並不難,下列給出的方法只是乙個例項,大神勿噴 大體上的操作是這樣的,首先找出峰值點,最小值或者最大值,然後根據最小或者最大值判斷其前後的單調性,並且判斷單調性是否相反,進而確定峰值數是否成立 這裡的單峰只含有最大值的峰點 include include int main if n...