LeetCode题目总结——位运算
1. 代替除法
- 0029 - 两数相除
2. 最大异或值
建立0-1字典树,将每个数字从高位开始,依次分叉放入字典树。搜索时,优先匹配高位不同的分支。
比如数字5(0101):
建立时的分支流向:0->1->0->1
搜索时的分支流向:1->0->1->0
struct Node {
int val = -1;
Node* n[2];
};
class TrieTree {
public:
void Add(int val) {
Node* root = &node;
for (int i = 1 << 30; i > 0; i >>= 1) {
int idx = val & i ? 1 : 0;
if (root->n[idx] == nullptr) root->n[idx] = new Node();
root = root->n[idx];
}
root->val = val;
}
int Get(int val) {
Node* root = &node;
for (int i = 1 << 30; i > 0; i >>= 1) {
if ((val & i) && (root->n[0] != nullptr)) {
root = root->n[0];
}
else {
root = root->n[1];
}
if (root == nullptr) {
return -1;
}
}
return root->val;
}
Node node;
};
- 周赛221 - 5640 - 与数组中元素的最大异或值
将数组进行排序,对查询数组按照查询范围进行排序,遍历查询数组,根据查询数组的限制范围,依次将数组中的数字加入Trie树,然后使用当前查询值在Trie树中查询最大异或值即可。
一些基本操作
- 取最后一位1的位置:
x = x & -x
- 最后一位1置0:
x = x & (x - 1)
- 格雷编码:
x = i ^ (i >> 1)