题目1: 给定一个含有n个元素的整形数组,其中只有一个元素出现奇数次,找出这个元素
异或
题目2: 如果题目1中有两个数出现了奇数次,并且这两个数并不相等,如何在O(1)的复杂度内找出这两个数
假设这两个数为a,b 异或结果为x。问题是我们如何能够通过x得到a,b. 因为x不为0,所以x的二进制肯定有一位为1. 例如x的二进制为001001,那么我们只需要一个不为0的那个。k=1(或者k=4)意味着a或者b中有一个第k位位1,所以我们再到数组中寻找所有k=1位为1的所有数,并将他们和x进行异或。假设这个数为a,那么所有k=1为1的数包括a和其他数T,x^a^T=x^a = a^b^a = b, 求得b之后再和x异或,求得a
void findElement(vector<int> v){ int s = 0; for (int i = 0; i < v.size(); i++){ s ^= v[i]; } int s_copy1 = s; int s_copy2 = s; int k = 0; //找到哪一位为1 while ( !(s_copy1 & 1)){ s_copy1 = s_copy1 >>1; k++; } //cout<<s<<" "<<k<<endl; for (int i = 0; i < v.size(); i++){ if ((v[i]>>k) & 1) s ^= v[i]; } //cout<<s<<" "<<s_copy2<<" "<<(s^s_copy2)<<endl; cout<<"one is: "<<s<<" the other one is: "<<(s^s_copy2)<<endl; }
时间: 2024-10-11 12:13:29