如何在無序陣列中尋找兩個出現奇數次整數

2021-07-24 05:23:36 字數 897 閱讀 7344

乙個無序陣列裡有若干個正整數,範圍從1到100,其中98個整數都出現了偶數次,只有

兩個整數出現了奇數次(比如1,1,2,2,3,4,5,5),如何找到這個出現奇數次的整數?

解法:

遍歷整個陣列,依次做異或運算。由於陣列存在兩個出現奇數次的整數,所以最終異或的結果,等同於這兩個整數的異或結果。這個結果中,至少會有乙個二進位制位是1(如果都是0,說明兩個數相等,和題目不符)。

舉個例子,如果最終異或的結果是5,轉換成二進位制是00000101。此時我們可以選擇任意乙個是1的二進位制位來分析,比如末位。把兩個奇數次出現的整數命名為a和b,如果末位是1,說明a和b轉為二進位制的末位不同,必定其中乙個整數的末位是1,另乙個整數的末位是0。

根據這個結論,我們可以把原陣列按照二進位制的末位不同,分成兩部分,一部分的末位是1,一部分的末位是0。由於a和b的末位不同,所以a在其中一部分,b在其中一部分,絕不會出現a和b在同一部分,另一部分沒有的情況。

這樣一來就簡單了,我們的問題又回歸到了上一題的情況,按照原先的異或解法,從每一部分中找出唯一的奇數次整數即可。

假設陣列長度是n,那麼該解法的時間複雜度是o(n)。把陣列分成兩部分,並不需要借助額外儲存空間,完全可以在按二進位制位分組的同時來做異或運算,所以空間複雜度仍然是o(1)。

#includevoid main()

; int i, xor = arr[0], bit_num = 0, value = 0, a = 0, b = 0;

for(i = 1; i < 10; i++)

while(value != 1)

for(i = 0; i < 10; i++)

else

} printf("the number is %d and %d.",a,b);

}

無序數字中位數 如何在無序陣列中查詢第K小的值

如題 給定乙個無序陣列,如何查詢第k小的值。例子如下 在乙個無序陣列,查詢 k 3 小的數 輸入 arr 輸出 7在乙個無序陣列,查詢 k 4 小的數 輸入 arr 輸出 10幾種思路如下和複雜度分析如下 1 最簡單的思路直接使用快排,堆排或者歸併排,排序之後取陣列的k 1索引的值即可,時間複雜度為...

尋找兩個正序陣列中的中位數

給定兩個大小為 m 和 n 的正序 從小到大 陣列nums1和nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為o log m n 示例 1 nums1 1 3 nums2 2 則中位數是 2.0示例 2 nums1 1 2 nums2 3 4 則中位數是 2 3 2 2.5方...

如何合併兩個有序陣列

題目 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。示...