演算法 元素重複三次的陣列中查詢重複一次的元素

2021-09-28 11:15:22 字數 1095 閱讀 9208

給定乙個大陣列,它裡面除了乙個元素外,其他元素都重複了三次,要求在空間複雜度為o(1), **時間複雜度為o(n)**的約束下,查詢到只重複了一次的元素。

意思就是說:這意味著演算法必須對陣列遍歷1次就要找出給定元素。

參考位圖演算法,

當某一位第一次出現1時,fa的該位值為1

當想通位第二次出現1時,fa該位值為0,sa該位值為1

當想通位第三次出現1時,fa該位值為0,sa該位值為0

這樣,出現三次的數值都會被過濾掉,而只出現一次的數值會留在fa中。

假設 e 為元素某位的值,我們需要有 newfa 和 newsa 來臨時儲存新的值,按照結果推到出關於 newfa 的如下**:

sa/e

0/00/1

1/01/1

fa=001

00fa=110

xx我們需要由這個**推導出 newfa 與 fa、sa、e的位運算關係:

所以newfa 與 fa、sa、e的位運算關係為 newfa = ~sa & (fa^e)

newsa 的如下**:

fa/e

0/00/1

1/01/1

sa=000

01sa=110

xx由這個**推導 newsa 與 fa、sa、e的位運算關係:

所以newfa 與 fa、sa、e的位運算關係為 newsa = (sa^e) & ~(fa^e)

之後再把 fa = newfa 和 sa = newsa 即可。

ps:推導的原則基本上就是不斷縮小取值範圍,直至完全匹配,然後用 & 連線運算因子。

swift code:

let arr =[1

,1,1

,2,2

,2,3

,3,3

,4];

va***=0

varsa=0

var newfa =

0var newsa =

0for e in arr

print(fa

)//4

print(sa

)//0

基於快排 查詢陣列中出現三次的元素

題目 陣列中有乙個元素出現3次,其餘出現兩次 找到出現三次的元素,要求空間複雜度 o 1 不要想用map 時間複雜度不大於o nlgn 思路 快排,count 記錄在比較過程中與基準元素相等的個數,如果 3 則直接返回 找到出現三次的數,陣列中的元素要麼出現兩次就是三次 public static ...

961 重複 N 次的元素

在大小為 2n 的陣列 a 中有 n 1 個不同的元素,其中有乙個元素重複了 n 次。返回重複了 n 次的那個元素。示例 1 輸入 1,2,3,3 輸出 3 示例 2 輸入 2,1,2,5,3,2 輸出 2 示例 3 輸入 5,1,5,2,5,3,5,4 輸出 5 4 a.length 10000 ...

961 重複 N 次的元素

weekly contest 116的 重複 n 次的元素 在大小為2n的陣列a中有n 1個不同的元素,其中有乙個元素重複了n次。返回重複了n次的那個元素。示例1 輸入 1,2,3,3 輸出 3示例2 輸入 2,1,2,5,3,2 輸出 2示例3 輸入 5,1,5,2,5,3,5,4 輸出 5 4 ...