還沒寫完
我個人認為,以面試來說不太會考位元運算的題目,
因為要在短時間內測出面試者的實力,有其他更好的選擇,例如前面基本的資料結構。
但是位元運算對於比較低階的語言,例如 assembly 或是 C,還是挺重要的。
^
xor&
bitwise and|
bitwise or~
bitwise not<<
左移>>
右移
這裡介紹一個省空間的方法
直覺上會想用 set 存,
這樣判斷新元素是否存在可以達到時間 O(1),但空間需要 O(N)。
而存在不存在這是個二元問題,
此時若用一個 bit array 來做標記,
也就是 0 代表存在,1 代表不存在,
index 則為要標記的英數字。(想辦法 mapping)
flags = [1, 0, 0, 1, 1]
再將 bit array encode 成整數
flags = 0b11001(2進位)= 25(10進位)
此時就能將原先需要 N 個 整數來標示,現在只需要 1 個整數了。
方法 | Time | Space | 例子 |
---|---|---|---|
set | O(1) | O(N) | exist = {1, 4, 5} |
bit array | O(1) 把目標設法 mapping 到 index | O(N) | exist = [1, 0, 0, 1, 1] |
integer | O(1) | O(1) | exist = 0b11001 |
&
確認 num 是否存在 -> 第 i bit(右至左)是否為 11 << (num - 1)
產生只有 i bit 為 1 的數字if flags & (1 << (num - 1)):
if flags & (1 << (num - 1)) == 1:
會錯的因為 == 優先
標記 num 存在 -> 第 i bit(右至左)設為 1flags |= (1 << (num - 1))
題目可以做看看
36. Valid Sudoku
n ^ n = 0
n ^ 0 = n
136. Single Number
n & (n - 1)
231. Power of Two