我有一个自定义类,我想对它的对象执行XOR操作。
我能想到的唯一方法是将对象序列化为String,然后将字符串转换为bytes数组,然后对其每个元素执行xor操作。然后,在需要时对其进行反序列化。
例如采用List->
的简单情况class ListNode {
int val;
ListNode next;
ListNode(int val) {this.val = val;}
}
ListNode l1 = new ListNode(2);
ListNode l1 = new ListNode(3);
// ListNode x = l1 ^ l2;
我想执行l1 XOR l2以实现一些有效的实现,但无法找到一种更简洁的方法来实现它。
有什么建议吗?
修改 在一种算法中,我只有1个指针,但通过使用XOR表示,我可以使用它来存储2个地址。
比方说,例如我的列表是5-> 4-> 3-> 2->>>>> ... 而不是存储5的节点= 4的下一个指针;我想要做的是将previousPointer XOR nextNodePointer存储在节点的下一个字段中。
所以
5's next pointer = NULL XOR 4
4's next pointer = 5 XOR 3..........
因此,在这种情况下,应该保存XOR的结果。 现在可以像这样遍历我们知道null在head之前。 要访问头部(5)的下一个节点4,我们可以执行null XOR nextPointer,所以基本上我们将为每个节点执行此操作
5 next pointer = null XOR 4 as above/
to acess 4 do null XOR (null XOR 4) = 4
now to access 3 do 5 XOR (5 XOR 3) = 5...
所以,我想在某个地方保存这个XOR信息但是我不能创建一个新的列表节点来保存它。 这可以在地址级别以某种方式完成,以便结果与上述操作一致。
答案 0 :(得分:2)
Java不支持运算符重载,因此您不会拥有ListNode x = l1 ^ l2;
。相反,您必须将其定义为方法:ListNode x = ListNode.xor(l1, l2);
。
为了实现它,你可以迭代节点:
public static ListNode xor(ListNode l1, ListNode l2) {
ListNode result = new ListNode(l1.val ^ l2.val);
while (l1.next != null) {
l1 = l1.next;
l2 = l2.next;
result.next = new ListNode(l1.val ^ l2.val);
}
}
注意:此实现假定l1
和l2
的长度相同。如果不能做出这个假设,那就应该把它作为一个小推文。
答案 1 :(得分:1)
Serialazing两个实例并将它们的表示作为一个字节数组进行xoring是没有意义的(结果甚至不会是这个类的实例的有效表示)。如果你想xor两个intsances的特定字段,那么,只需xor。
答案 2 :(得分:0)
您将无法使用引用执行此操作,因为Java的垃圾收集器依赖于能够直接跟踪引用。您可能会得到引用的整数版本,但是您无法从整数返回到引用,如果您不将引用存储到节点,则该节点将被垃圾回收。
如果需要,您可以将所有节点保存在一个数组中,而不是每个节点都有一个对prev / next节点的引用,它具有prev / next节点的索引。那将允许你做XOR技巧。