题目:EPI
设题目中的遗漏值为m,重复值为t。
方法一:
先计算出t-m,然后计算t^2-m^2,进一步可得t+m。已知t-m和t+m,可求出答案。缺点是相加时有可能溢出。
方法二:
用异或来做。
//该函数的功能是判断整数num转化为二进制时,第index位是不是1
bool Is_some_bit_one(int num,int index)
{
int x=1<<index;
if(num & x)
return true;
else
return false;
}
//返回的第一个值是遗漏值m,第二个是重复值t
pair<int,int> find_missing_duplicate(const unordered_set<int> &Z,const vector<int> &A)
{
int m_xor_t=0;
for(auto i=Z.begin();i!=Z.end();i++)
m_xor_t=m_xor_t^(*i);
for(auto i=A.begin();i!=A.end();i++)
m_xor_t=m_xor_t^(*i);
int index,tmp=m_xor_t;
for(int i=0;i<32;i++)
{
if(Is_some_bit_one(m_xor_t,i))
{
index=i;
break;
}
}
for(auto i=Z.begin();i!=Z.end();i++)
{
if( Is_some_bit_one((*i),index))
tmp=tmp^(*i);
}
for(auto i=A.begin();i!=A.end();i++)
{
if( Is_some_bit_one((*i),index))
tmp=tmp^(*i);
}
//此时tmp是重复值t,或者是遗漏值m
//判断tmp是否是遗漏值
int tmp_is_missing=true;
for(int i=0;i<A.size();i++)
{
if(A[i]==tmp)
{
tmp_is_missing=false;
break;
}
}
pair<int,int> res;
if(tmp_is_missing)
{
res.first=tmp;
res.second=m_xor_t^tmp;
}
else
{
res.second=tmp;
res.first=m_xor_t^tmp;
}
return res;
}