###### tags: `Leetcode` `medium` `bit` `python` `c++` # 421. Maximum XOR of Two Numbers in an Array ## [題目連結:] https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/ ## 題目: Given an integer array ```nums```, return the maximum result of ```nums[i] XOR nums[j]```, where ```0 <= i <= j < n```. **Example 1:** ``` Input: nums = [3,10,5,25,2,8] Output: 28 Explanation: The maximum result is 5 XOR 25 = 28. ``` **Example 2:** ``` Input: nums = [14,70,53,83,49,91,36,80,92,51,66,70] Output: 127 ``` ## 解題想法: * 此題為,给一個數組nums ,求nums[i] XOR nums[j] 的最大结果,其中 0 ≤ i ≤ j < n 。 * 使用bits判斷: (Ps.本人超討厭bits相關題目 (´・_・`) ) * for (int bit=31; bit>=0; bit--) * 使用位運算,從**高位**到**低位**依次決定每個位數是1or0 * 其中checkSet: 用set紀錄,nums中的數字分別除bit次2的冪方 * 再逐一判斷checkSet中的元素: item * 若希望最大結果: res+1 * 與item xor後,存在於checkSet中: **表示當前位置可以為1** * 所以將res正式+1,then break ## Python: ``` python= class Solution(object): def findMaximumXOR(self, nums): """ :type nums: List[int] :rtype: int """ #從最高位bit做check #32bit 32+31bit 32+31+30bit...........逐一check最大的 -> key res=0 for bit in range(31,-1,-1): res<<=1 #-> key checkSet = set(n>>bit for n in nums) #狂右移除2的冪方(同下面三句) #checkSet=set() #for n in nums: # checkSet.add(n>>bit) for item in checkSet: #若希望的最大結果:res+1 #與item xor後 存在於checkSet中 表示該bit可以為1 if (res+1)^item in checkSet: res+=1 break return res nums = [3,10,5,25,2,8] result=Solution() ans=result.findMaximumXOR(nums) print(ans) ``` ## C++: ``` cpp= class Solution { public: int findMaximumXOR(vector<int>& nums) { int res=0; for (int bit=31; bit>=0; bit--){ res<<=1; unordered_set<int> checkSet; //collect for (auto n: nums){ checkSet.insert(n>>bit); } //check for (auto item: checkSet){ auto tmp=(res+1)^item; if (checkSet.find(tmp)!=checkSet.end()){ res+=1; break; } } } return res; } }; ```