從各個角度扯談一面試演算法題

2021-09-01 03:10:39 字數 1508 閱讀 2361

題目:乙個int型陣列,存放的資料中有兩個重複的次數是奇數次,其他的重複的次數全是偶數次。

要求:找出這兩個資料,時間複雜度是o(n) 空間複雜度是o(1)

名詞簡單解釋:

時間複雜度是o(n)案例:遍歷乙個長度為n的陣列,時間複雜度是o(n) 如果在for迴圈裡巢狀乙個長度為n的迴圈那麼時間複雜度是o(n2).如果兩個for迴圈有先後順序,無巢狀關係,時間複雜度還是o(n).

空間複雜度是o(n)案例:建立乙個長度為n的陣列占用的空間是與n成正比的,空間複雜度是o(n).

解決辦法:

(1)假設資料是:55,44,33,44,44,44,22,33,55,55,22,22。

(2)第一步:將資料依次進行異或運算,即:55與44異或運算得到a,a再與33異或運算得到b,一直到最後得到乙個數值為x.  

步驟詳解:

1>「異或」規則:相同為0 不同為1  例如1001異或1010等於0011

2> 進行異或運算以後,所有的出現偶數次的數,變成了0,相當於被剔除,出現奇數次的55中有2個55異或得到0,3個22中有2個異或得到0,最後相當於55和22進行異或運算,得到x(可以肯定的是x不為0)

(3)第二步:假設x的右邊的第一位為1(其他位上為1同樣可以使用該位),寫乙個方法假設是public boolean isone(int value,int num){},用途是判斷輸入的value在第num位是否為1,返回boolean結果。將x與原始資料再次進行異或運算。不過要加上isone方法進行判斷,結果是x分別與在第一位上是1的資料異或得到a,第一位上是0的資料異或得到b,a和b就是要求的兩個數。

步驟詳解:

isone()方法將資料分為兩種即第一位上為0的和第一位上是1的,可以肯定的是要求 的資料a

和b一定是不同的兩種型別。那麼就像是第一步中一樣所有的出現偶數次的全部消去,結果是x與22異或得到結果是55,x與55異或得到結果是22。

一些想法:

變形1:乙個int型陣列,存放的資料中有兩個重複的次數是偶數次,其他的重複的次數全是奇數次。(奇數和偶數變換順序)

變形2:乙個int型陣列,存放的資料中有3個重複的次數是奇數次,其他的重複的次數全是偶數次。(2個變為3個)

變形1:仔細分析的話結果是行不通的,對於第乙個的想法可以變成不是異或運算而是同或運算,但是第一步就將要求的兩個數a和b剔除了。所以第一步就做不到得到乙個上一種的乙個肯定不為0的x。就別提第二步了。

變形2:第一步可以實行,得到乙個a,b和c 三個數異或。但是不能確定這個結果肯定為0或不為0,事情變得不好處理。可以分類討論。(此處不做分析)

再看本題該方法的妙處:

依據:第一步利用資料a和b的相同之處是兩者出現的次數是偶數,此條件可以將所有的資料分為兩派,此時a和b屬於同一方。

第二步利用資料a和b的不同之處是兩者至少存在一位不同,此條件可以將所有的資料分為兩派,此時a和b屬於不同方。

關鍵方法:巧用異或,解決了關於奇次和偶次的問題。

不論是奇還是偶,還是「兩」個數。其實都是表示了0和1世界中的兩種可能,代表的是中邏輯,無關數量。知己知彼才能各個突破。

面試演算法題總結 一

華為面試題 寫乙個程式,要求功能 求出用1 2 5 這三個數不同個數組合的和為100 的組合個數。如 100 個1 是乙個組合,5 個1 加19 個5 是乙個組合。請用c 語言寫。答案 最容易想到的演算法是 設x 是1 的個數,y 是2 的個數,z 是5 的個數,number 是組合數 注意到0 x...

面試演算法題總結 一

思想,每次隨機取乙個數,將大於其的放在右邊,小於或等於其的放在左邊,如此遞迴 def quicksort arr if len arr 1or len list filter lambda a a arr 0 arr len arr return arr middle random.choice r...

C 筆試面試(演算法題集一)

1 你讓一些人為你工作了七天,你要用一根金條作為報酬。金條被分成七小塊,每天給出一小塊。如果你只能將金條分割兩次,你怎樣分給這些工人?解答 將金條分割成1 2 4.這樣這三個數字將可以組成1 7的任何數字。2 用一種演算法來顛倒乙個鍊錶的順序。解答 遞迴的解法 node reverse node h...