位運算 找出陣列中,只出現一次的兩個數字

2021-07-29 05:31:40 字數 1280 閱讀 7743

題目:

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,請寫程式找出這兩個出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1).

分析:由於限制了複雜度,所以要用異或運算來解,什麼是異或?

首先,計算機1個位元組是8位(1byte=8bit);其次,異或運算是:兩個輸入相同時為0,不同則為1。

舉例陣列:

核心思路:

1、陣列中全部資料異或操作後,依次對陣列中的每個元素進行異或(相同位為0,不同為1)操作,得到0000 0010。

2、倒數第二位是1,說明我們要找的那兩個只出現一次的數字,倒數第二位是不同的。

3、下面根據每個數二進位制倒數第二位是不是1來分成兩組,倒數第二位為1的是,倒數第二位為0的是。

4、接下來對這兩個陣列分別進行異或操作,剩下的數字就是只出現一次的數字。

**:

public class findoncenum 

//resultexclusiveor是那兩個出現一次的數字的異或值

int resultexclusiveor = 0;

int first = 0, second = 0;

for (int i = 0; i < values.length; i++)

system.out.println("resultexclusiveor: " + integer.tobinarystring(resultexclusiveor));

/*resultexclusiveor中找到第乙個為1的位的位置

resultexclusiveor右移一位, count左移一位, 當resultexclusiveor = 1的時候, count的值就是第一位為1的位置

*/int count = 1;

while (true)

resultexclusiveor >>= 1;

count <<= 1;

}system.out.println("count: " + integer.tobinarystring(count));

//根據count分成兩組,分別找出不重複的那個數字

for (int i = 0; i < values.length; i++) else

}system.out.println(first);

system.out.println(second);

}public static void main(string args) ;

new findoncenum().find(values);

}}

找出陣列中只出現一次的兩個數

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 思路 首先交待一下異或的基本性質 2個相同的數異或等於0,且異或操作 滿足結合律和交換律。再來考慮一種簡單一點的情況 乙個陣列中只有乙個元素出現唯一的一次,而...

找出陣列中只出現一次的數字

乙個整型陣列裡除了乙個數字以外,其他數字都出現了兩次。找出這個只出現一次的數字 異或運算 任何乙個數字異或它本身都等於0,如果從頭到尾異或陣列中的每乙個數字,那些出現兩次的數字全部在異或中會被抵消,最終的結果剛好是這個只出現一次的數字 package jbarray 找出陣列中只出現一次的數字 au...

找出陣列中只出現一次的數

今天來看一道有意思的題,看起來很簡單,但是要想到滿足要求的答案沒那麼容易。有乙個非空整形陣列,除了有乙個只出現過一次的數,其他的數都出現且只出現過兩次,現要求找出這個只出現過一次的數。時間複雜度不能超過 o n 而且不能使用額外空間。大概意思就是,比如從 5,5,8,8,6,9,9 陣列中找出 6 ...