[小米OJ] 2. 找出单独出现的数字
解法一:
map
1.45 ms
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int main()
{
int temp;
map<int, int> mapping;
while (scanf("%d", &temp) != EOF)
{
mapping[temp]++;
}
for (map<int, int>::iterator it = mapping.begin(); it != mapping.end(); it++)
{
if (it->second == 1)
{
printf("%d", it->first);
}
}
system("pause");
return 0;
}
解法二:
因为题目提出“其中仅有一个数字出现过一次,其他数字均出现过两次”,即可以利用异或计算
一个数字异或它自己结果为0,异或0结果为它自己即a^a=0,a^0=a,且异或满足a^b^c=a^(b^c)。
因此我们可以设置一个ret异或每个元素,最后相同的都抵消为0,那个唯一的数字异或0为它自己即为答案。
1.97 ms
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int main()
{
int temp;
int arr[21];
int i = 0;
while (scanf("%d", &temp) != EOF)
{
arr[i] = temp;
i++;
}
int ret = 0;
for (int j = 0; j < i; j++)
{
ret ^= arr[j];
}
printf("%d",ret);
system("pause");
return 0;
}