还没写完
我个人认为,以面试来说不太会考位元运算的题目,
因为要在短时间内测出面试者的实力,有其他更好的选择,例如前面基本的资料结构。
但是位元运算对於比较低阶的语言,例如 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(右至左)是否为 1
1 << (num - 1)
产生只有 i bit 为 1 的数字
if flags & (1 << (num - 1)):
if flags & (1 << (num - 1)) == 1:
会错的因为 == 优先
标记 num 存在 -> 第 i bit(右至左)设为 1
flags |= (1 << (num - 1))
题目可以做看看
36. Valid Sudoku
n ^ n = 0
n ^ 0 = n
136. Single Number
n & (n - 1)
231. Power of Two
<<: Day 4 情报收集 - Information Gathering (DNS analysis)
>>: Day 4 Ruby 变数与资料型别 Variable and Data Type
昨天虽然完成了以永丰银行虚拟帐号付款方式进行结帐,但如果没有找个地方显示帐号,顾客也不知道要汇钱到那...
今天好累,直接上题目 题号:36 标题:Valid Sudoku 难度:Medium Determi...
之前上课时jQuery讲师说到: :nth-child(b) b要从1开始,不知道为什麽 比如$('...
今天想来谈谈一个把高维度资料可视化的应用:MDS,MDS是一种unsupervised machin...
如同前面介绍的,Flutter 定义了三种不同型别的Platform Channel 在platfo...