classNode: zero = None one = None classSolution(object): defadd(self, root, i): node = root for j inrange(31, -1, -1): mask = 1 << j left = mask & i if left: if node.one == None: node.one = Node() node = node.one else: if node.zero == None: node.zero = Node() node = node.zero
deffind(self, root, i): ans = 0 node = root for j inrange(31, -1, -1): mask = 1 << j left = i & mask if node.one and node.zero: if left: node = node.zero ifnot left: node = node.one ans += mask else: if (node.one andnot left) or (node.zero and left): ans += mask node = node.one or node.zero
return ans
deffindMaximumXOR(self, nums): """ :type nums: List[int] :rtype: int """ root = Node() ans = 0 max_left = 0 candidate = [] for i in nums: self.add(root, i) left = math.ceil(0if i == 0else math.log(i, 2)) if left == max_left: candidate.append(i) if left > max_left: max_left = left candidate = [] candidate.append(i) for i in nums: ans = max(ans, self.find(root, i)) return ans