问题描述
给定两个整数向量 A 和 B,我们必须从每个向量中选择一个元素,使得它们的 xor 最大,我们需要从函数 int 中返回这个最大的 xor 值::solve(vector &A,vector &B).
我发现下面的代码没有通过所有测试用例 当我在类 Trienode 正下方全局声明和初始化头指针时。这是为什么?
代码
class Trienode
{
public:
Trienode* left;
Trienode* right;
Trienode()
{
left=0;
right=0;
}
};
// Trienode* head = new Trienode;
int Max_Xor_Pair(Trienode* head,vector<int> B)
{
int n=B.size();
int max_xor=INT_MIN;
for(int i=0; i<n; i++)
{
int pair1 = B[i];
int pair2 = 0;
Trienode* curr=head;
for(int j=31; j>=0; j--)
{
int bit = (pair1>>j)&1;
if(bit)
{
if(curr->left)
curr=curr->left;
else
{
curr=curr->right;
pair2 += pow(2,j);
}
}
else
{
if(curr->right)
{
curr=curr->right;
pair2 += pow(2,j);
}
else
curr=curr->left;
}
}
int curr_xor = pair1 ^ pair2;
max_xor = max(max_xor,curr_xor);
}
return max_xor;
}
void Insert(Trienode* head,int num)
{
Trienode* curr=head;
for(int i=31; i>=0; i--)
{
int x = num;
int bit= (x>>i)&1;
if(bit)
{
if(!curr->right)
{
Trienode* temp = new Trienode;
curr->right=temp;
}
curr=curr->right;
}
else
{
if(!curr->left)
{
Trienode* temp = new Trienode;
curr->left=temp;
}
curr=curr->left;
}
}
}
int Solution::solve(vector<int> &A,vector<int> &B) {
Trienode* head = new Trienode;
for(int x:A)
Insert(head,x);
return Max_Xor_Pair(head,B);
}
样本输入
A : [ 15891,6730,24371,15351,15007,31102,24394,3549,19630,12624,24085,7,197,197 7377,13932,26309,16945,32440,24627,11324,5538,21539,16119,2083,22930,16542,4834,31116,4640,29659,22705,9931,13978,2307,31674,22387,5022,28746, 26925、19073、6271、5830、26778、15574、5098、16513、23987、13291、9162 ]
B : [ 18637,22356,24768,23656,15575,4032,12053,27351,1151,16942 ]
解决方法
当 head
是一个全局变量,而您在 Solution::solve
中没有这一行时:
Trienode* head = new Trienode;
...then head
将在第一个测试用例完成后保留其值,因此第二个测试用例不会以空树开始。每个测试用例将添加更多节点到一个树。当然,这意味着,除了第一个测试用例,以 head
为根的树不是预期的树。
要使具有全局变量的版本正常工作,请在 Solution::solve
中重置:
head->left = head->right = nullptr;
顺便说一句,您还应该在 nullptr
构造函数中使用 TrieNode
(而不是 0)初始化这些成员。这更好地反映了意图。