iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0

還沒寫完
我個人認為,以面試來說不太會考位元運算的題目,
因為要在短時間內測出面試者的實力,有其他更好的選擇,例如前面基本的資料結構。
但是位元運算對於比較低階的語言,例如 assembly 或是 C,還是挺重要的。

Common operators

^ xor
& bitwise and
| bitwise or
~ bitwise not
<< 左移
>> 右移

用 bit 標記存在,節省空間

這裡介紹一個省空間的方法

時機:標記某個數字 / 英文字的存在

直覺上會想用 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

check ith bit &

確認 num 是否存在 -> 第 i bit(右至左)是否為 1
1 << (num - 1) 產生只有 i bit 為 1 的數字
if flags & (1 << (num - 1)):
if flags & (1 << (num - 1)) == 1: 會錯的因為 == 優先

set ith bit |=

標記 num 存在 -> 第 i bit(右至左)設為 1
flags |= (1 << (num - 1))

題目可以做看看
36. Valid Sudoku

xor

n ^ n = 0
n ^ 0 = n
136. Single Number

去除 LSB

n & (n - 1)
231. Power of Two


上一篇
【LeetCode】BFS
下一篇
【LeetCode】Dynamic Programming I
系列文
快樂社畜路:畢業後的後端開發求職準備31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言