劍指offer 面試題40 陣列中只出現一次的數字

2021-07-11 03:36:48 字數 487 閱讀 3178

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

思路:採取異或的辦法,兩個相同的數異或必然等於0。由於0與任何數異或可以得到本身,我們可以用0異或陣列的每乙個元素。因為存在兩個不同的數,所以異或的結果不等於0。結果的位中至少包含乙個1。譬如0010,如果以判斷倒數第二位是不是1來判斷陣列中的元素,則可以將陣列分成兩個子陣列,相同的元素因為所有位都相同,所以必然會分配到同乙個陣列,而那兩個只出現一次的數,肯定會分配到不同的陣列。(因為結果中的位1正是由於它們在那一位上不同而產生的)。對這兩個子陣列再採用0異或,消除了子陣列中出現兩次的數,最後各自分別剩下乙個數,就是我們要找的兩個只出現一次的數。 }

unsigned int findfirstbitis1(int num)

return indexbit;

}bool isbit1(int num, unsigned int indexbit)

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...

劍指offer 面試題40 最小的K個數

面試題 劍指offer 題目解答 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,坑點 輸入n個整數,找出其中最小的k個數 在這裡我們很容易在主觀上預設n k,從而在討論k的不合法性時,忘記了k n的情況,實際上當 k n 或者...

劍指offer面試題40 最小的k個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法一 快速排序,o n 修改原陣列 要注意和原始快排的區別,當不滿足start end時,需要返回end,而不是直接返回 方法二 堆排序 k個元素的最大堆 o nlogk 適合海...