7. 位运算
-
只出现一次的数字: https://leetcode-cn.com/problems/single-number/
class Solution { public: int singleNumber(vector<int>& nums) { int ret = 0; for (auto e: nums) ret ^= e; return ret; } };
-
丢失的数字: https://leetcode-cn.com/problems/missing-number/
class Solution { public: int missingNumber(vector<int>& nums) { int res = 0; int n = nums.size(); for (int i = 0; i < n; i++) { res ^= nums[i]; } for (int i = 0; i <= n; i++) { res ^= i; } return res; } };
-
只出现一次的数字 III: https://leetcode-cn.com/problems/single-number-iii/
class Solution { public: vector<int> singleNumber(vector<int>& nums) { int xorsum = 0; for (int num: nums) { xorsum ^= num; } // 防止溢出 int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum)); int type1 = 0, type2 = 0; for (int num: nums) { if (num & lsb) { type1 ^= num; } else { type2 ^= num; } } return {type1, type2}; } };
-
最大单词长度乘积: https://leetcode-cn.com/problems/maximum-product-of-word-lengths/
//mask 计算 //要获取 111111111,将 0 取反即可,~0。 //要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask:00010000。 //要得到 1 到 i 位为 1 的 mask,(1<<i)-1 即可,例如将 (1<<4)-1 = 00010000-1 = 00001111。 //要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 ~((1<<i)-1)。
class Solution { public: int maxProduct(vector<string>& words) { int length = words.size(); vector<int> masks(length); for (int i = 0; i < length; i++) { string word = words[i]; int wordLength = word.size(); for (int j = 0; j < wordLength; j++) { masks[i] |= 1 << (word[j] - 'a'); } } int maxProd = 0; for (int i = 0; i < length; i++) { for (int j = i + 1; j < length; j++) { if ((masks[i] & masks[j]) == 0) { maxProd = max(maxProd, int(words[i].size() * words[j].size())); } } } return maxProd; } };