輸入:[ 1,2,3,4,5,2,1,3 ]
輸出:4 , 5
方法一:先對陣列進行排序,排序後進行相鄰的數字比較是否相同。圖示:
//氣泡排序}}
}void
finddog
(int
* a,
int n,
int* num )
else
//不相等,記錄第乙個資料,第二個為起始位置}}
intmain()
;int num[2]
=;int sz =
sizeof
(arr)
/sizeof
(arr[0]
);//元素個數
finddog
(arr,sz,num)
;printf
("%d %d "
, num[0]
,num[1]
);return0;
}方法二 :異或(兩數,相同為 0 ,相異為 1 ),整個陣列全部元素進行異或,出現兩次的元素異或為「0」,最後的結果不可能是零(否則沒有單身狗了,不可能,我就是單身狗),尋找陣列元素異或後二進位制為 1 的位置(區別),然後將該陣列分為兩組,一組該二進位制位全為 1 ,將陣列中該位為1的所有數異或,因為陣列中相同的數異或為0,僅留下該位為1的單身狗數;另外一組該位全為0,同理,該位為0的所有數異或,最後僅留下該位為0的單身狗數。
#include
void
finddog
(int a,
int sz,
int* num)
//尋找這兩個不同數異或結果的乙個位為 1 的位
for(pos =
0; pos <
32; pos++)}
for(i =
0; i < sz; i++
)//找到陣列中pos位為0的數,並進行異或
else}}
intmain()
;int num[2]
=;int sz =
sizeof
(arr)
/sizeof
(arr[0]
);finddog
(arr, sz, num)
;printf
("%d %d\n"
, num[0]
, num[1]
);return0;
}
尋找單身狗
給出2 n 1 個的數字,除其中乙個數字之外其他每個數字均出現兩次,找到這個數字 對於該問題,我們直觀得想到,暴力遍歷整個陣列,逐一得排查陣列元素,直到找到那個單獨的數字。這個方法也很容易實現,但是其時間複雜度為o n 2 其效率並不高,不宜採用。另一種方法也很容易想到,我們可以先對整個陣列排序,然...
1040尋找單身狗
時間限制 1 sec 記憶體限制 128 mb 提交 159 解決 51 統計杜陵韋固,元和二年旅次宋城遇一老人倚布囊,坐於階上,向月撿書。固問所尋何書,答曰 天下之婚牘耳。又問囊中何物,答曰 赤繩子耳。以系夫妻之足,及其生,則潛用相繫,雖讎敵之家,貴賤懸隔,天涯從宦,吳楚異鄉,此繩一系,終不可逭。...
尋找單身狗數
方法一 異或求單身狗 原理 相同兩數異或為0 把所有數全部異或。異或的結果找1出現的位置的,然後將所有這個位置為1的數相異或,就是第乙個 單身狗 其他的相異或則是第二個。void finddog int arr,int n,int num for i 0 i 32 i for i 0 i n i v...