給定乙個大陣列,它裡面除了乙個元素外,其他元素都重複了三次,要求在空間複雜度為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 ...