Example 1: Input: [1,1,3,1] Output: 3
我们可以通过2种方法解决此问题:
- unordered_map
- XOR操作。
“ unordered_map”的解决方案与“单数”。
下面详细说明有关使用BIT操纵的解决方案。
如果问题是这样的:“一个元素出现一次,所有其他元素出现一次”,则解决方案是对元素进行XOR。原因是x ^ x = 0,所以所有成对的元素都将消失,仅留下孤独的元素。如果我们在此处尝试相同的策略,那么我们将得到不同元素的XOR,这不是我们想要的。
而是,上述算法执行以下操作:
到目前为止,所有元素已经出现一次的所有元素的异或
二进制是到目前为止已出现两次的所有元素的XOR
每次我们将x用作数组中的下一个元素时,都会出现以下三种情况:
如果这是x第一次出现,则将其异或
如果这是第二次出现x,则将其从1中取出(再次对其进行XOR),然后将其XOR运算为2
如果这是第三次出现x,则将其从1和2中取出。
因此,最后,它们将只是一个元素的XOR,即不再重复的孤独元素。我们需要查看5行代码以了解其工作原理:x = A [i]之后的5行。
#include<iostream> #include<vector> #include<unordered_map> using namespace std; int solution_using_unordered_map(vector<int> &nums) { unordered_map<int,int>mp; for(int i = 0;i < nums.size();i++) mp[nums[i]]++; unordered_map<int,int>::iterator it; for(it = mp.begin();it != mp.end();it++) { if(it->second < 3) return it->first; } } int solution_using_Bit_Manipulation(vector<int> &nums) { int 上es = 0; int twos =0; int common_bit_mask; for(int i=0; i<nums.size();i++) { twos= twos|(ones&nums[i]); 上es=ones^nums[i]; common_bit_mask= ~(ones&twos); 上es &=common_bit_mask; twos &=common_bit_mask; } return 上es; } int main() { vector<int> nums; nums.push_back(1); nums.push_back(1); nums.push_back(1); nums.push_back(2); cout<<"The result using unordered_map = "<<solution_using_unordered_map(nums)<<endl; cout<<"The result using XOR = "<<solution_using_Bit_Manipulation(nums)<<endl; return 0; }
输出:
使用unordered_map = 2的结果
使用XOR = 2的结果
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |