用map挺简单,但是空间有点超限:
#include<iostream>
#include<cstdio>
#include<map>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int main()
{
//cout << fixed << setprecision(0);
//cout << setw(8) << setiosflags(ios::left);
map<int,int> mp ;
int n;
llu a;
cin >> n ;
for(int i=0;i<n;i++)
{
cin >> a ;
mp[a]++;
}
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
if(it->second%2==1){
cout << it->first << endl ;
break;
}
}
return 0;
}
尝试直接开数组暴力遍历,依然内存超限:
#include<iostream>
#include<cstdio>
#include<map>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int main()
{
//cout << fixed << setprecision(0);
//cout << setw(8) << setiosflags(ios::left);
int n;
cin >> n ;
int a[n+5]={
0};
for(int i=0;i<n;i++)
{
cin >> a[i] ;
}
sort(a,a+n);
//一次跳两个,如果当前位置和下一个位置长度不一样,证明是奇数个这种长度的筷子
for(int i=0;i<n;i+=2){
if(a[i]!=a[i+1]){
cout<<a[i];
return 0;
}
}
return 0;
}
没办法了,查到了异或的知识,偶数个相同的数异或的结果为0,那就把所有输入都异或一遍,剩的就剩那个落单的:
#include<bits/stdc++.h>
using namespace std;
int main()
{
//cout << fixed << setprecision(0);
//cout << setw(8) << setiosflags(ios::left);
int n,a,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
ans^=a;
}
printf("%d\n",ans);
return 0;
}