「萬里挑一」演算法

2021-09-05 21:19:41 字數 2677 閱讀 8253

題目:1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現

一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空

間,能否設計乙個演算法實現?

時間還是o(n),無額外儲存空間(說白了就是除了陣列之外,不能額外開闢記憶體空間儲存陣列元素)。 //

初始化intn =

10;int a 

=new

int[n];

random rand 

=new

random();

//賦值

for(

inti =1

; i 

<

a.length; i++)

intidx1 =0

;int

idx2 =0

;//打亂順序

for(

inti =0

; i 

<

a.length *10

; i++

)a[idx1] 

=a[idx1] 

^a[idx2];

a[idx2] 

=a[idx1] 

^a[idx2];

a[idx1] 

=a[idx1] 

^a[idx2];}//

建立重複元素乙個

idx1 

=rand.next(n);

while

(a[idx1] ==0

)idx1 

=rand.next(n);

for(

inti =0

; i 

<

a.length; i++)

}//查詢unsafe

//loop array

while

(p1 

n)}}}

這個帖子掛了一天,能看懂我的方法人很少阿,為了節省大家的時間,我解釋如下,

假設陣列有10個元素,初始化時元素如下:

-        a        int

[0x00000000]    0x00000003    

int[0x00000001]    0x00000008    

int[0x00000002]    0x00000001    

int[0x00000003]    0x00000009    

int[0x00000004]    0x00000007    

int[0x00000005]    0x00000002    

int[0x00000006]    0x00000006    

int[0x00000007]    0x00000005    

int[0x00000008]    0x00000007    

int[0x00000009]    0x00000004    

int可以看出,相重的元素在a[4] 和a[8]處,也就是說陣列迴圈到a[8]時才能發現相同的元素。

迴圈一次:

-        a        int

[0x00000000]    0x00000003    

int[0x00000001]    0x00000008    

int[0x00000002]    0x00000001    

int[0x00000003]    0x00030009    

int[0x00000004]    0x00000007    

int[0x00000005]    0x00000002    

int[0x00000006]    0x00000006    

int[0x00000007]    0x00000005    

int[0x00000008]    0x00000007    

int[0x00000009]    0x00000004    

int可以看出a[3]的值變了,變為了0x00030009.因為我將a[0]的低16位寫到了a[3]的高16位部分。因為數字是1~10000,所以16位數字就能表示,而對於int來說,32位數字其高位是用不到的,所以就有空間可用了。

思路是:依次將數字寫到該數字為索引的位置,當發現欲寫的值和數字索引位置的數字相等時(其實也可以簡單置為1),則命中。

下面當迴圈執行到a[8]的時候:

-        a        int

[0x00000000]    0x00000003    

int[0x00000001]    0x00010008    

int[0x00000002]    0x00020001    

int[0x00000003]    0x00030009    

int[0x00000004]    0x00000007    

int[0x00000005]    0x00050002    

int[0x00000006]    0x00060006    

int[0x00000007]    0x00070005    

int[0x00000008]    0x00080007    

int[0x00000009]    0x00090004    

int此時,a[8]的低位是7,所以應寫為a[7]=7; 但是這個時候a[7]的高位已經是7了,所以命中,跳出。

NYOJ 634萬里挑一 優先佇列

題目連線 分別從兩個陣列中各任取乙個數相加,可以得到n 2個和,求這些和中最大的前m個數 我們把這n 2個和組織成如下n個有序表 表1 a1 b1 a1 b2 a1 b3 表2 a2 b1 a2 b2 a2 b3 表3 an b1 an b2 an b3 其中第a張表裡的元素形如aa bb,我們用二...

萬里挑一 雲集遊戲測試精英 牛掰

一款遊戲研發之初需要做使用者調研,不少廠商花了大半個月,投入大量資源進行了完整的遊戲使用者調研,但實際遊戲上線後才發現效果已經偏離預期遊戲設計者的預期。遊戲開發過程中如何驗證自己的產品定位是否準確呢?遊戲上線前的真人眾測 對驗證遊戲的實際效果有著很大的幫助,目前有不少遊戲廠商都會在遊戲上線前請一些玩...

這才是最完美SSD 效能滿血發揮 萬里挑一

固態硬碟同質化日益嚴重,不同品牌的固態盤想要一決高下就只有靠品牌口碑與做工硬實力了。最近影馳對他們的one系列固態硬碟產品進行了一波更新,推出了多種容量的one pcie m.2 ssd,今天我們就來看看這款更新過的 萬里挑一 固態硬碟到底有沒有料。10秒了解影馳one系列 影馳one pcie 5...