Codevs2605题解

  • 写在前面:学学stl,刷刷水题,练练vector

  • 题目描述 Description
    小明才会学数数,妈妈就开始难为他了。告诉他N(N<=1000000)个数字,问他哪一个数字出现的次数为奇数(保证N为奇数,数据中每个数字出现的次数只有一个为奇数次,每个数字为int范围内)

  • 输入描述 Input Description
    第一行一个N;第i+1行为第i个数字

  • 输出描述 Output Description
    输出仅仅一行,为出现奇数次的那个数字

  • 样例输入 Sample Input
    5
    3
    6
    7
    6
    3

  • 样例输出 Sample Output
    7

  • 数据范围及提示 Data Size & Hint
    时间限制: 1 s
    空间限制: 32000 KB

  • 题解
    不知道为什么分到了数论里,一个哈希表貌似就可以搞定了。每读入一个数,从哈希里找:找到了就从哈希里删掉,找不到就插入。最后扫一遍哈希,哪个size不是0,就输出哪个里存的数。

  • Code

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int m = 299993;
int n;
vector <int> hash[300000];
void ins(int p)
{
    int k = p % m;
    vector <int> :: iterator i;
    bool b = false;
    for(i = hash[k].begin(); i != hash[k].end(); i++) if((*i) == p)
    {
        b = true; break;
    }
    if(b) hash[k].erase(i);
    else hash[k].push_back(p);
}
int main()
{
    int x;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d", &x);
        ins(x);
    }
    for(int i = 0; i < m; ++i) if(hash[i].size() != 0)
    {
        printf("%d", hash[i][0]);
        break;
    }
    return 0;
}
  • 追加
    好吧我知道了,是异或的性质。
a ^ 0 == aa ^ b ^ b == a;
inline void swap(int& a, int& b)
{
    a ^= b;
    b ^= a;
    a ^= b;
}
  • Code
#include <cstdio>
int main()
{
    int n, ans = 0, a;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d", &a);
        ans ^= a;
    }
    printf("%d\n", ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值