解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数。
看起来好像很简单的样子,不过,这题的重点不在这里,看下内存限制就知道了,只有1024KB,也就是1M,而n的范围是1000000,输入的数的范围更是在int以内,所以这题其实考的就是一个内存优化的问题。当然,这让我们很自然的联想到中数据结构-动态链表,要多少分配多少,这样就可以最大限度的减少不必要的内存消耗。很久没写动态链表了,竟然调试了很久。不过在discuss里面看到有位神牛的做法,顿时就感觉弱爆了,他的代码只有几行,原理就是利用C语言里面的 ^ (异或)运算,内存竟然只用了240KB,而我用动态链表写的内存用了280KB,还有用动态链表写一定要记得在删除节点的时候把那块内存删除,要不然还是过不过了,不过只超出40KB了。
#include<cstdio>
struct node {
int x;
node *next;
};
void insert(node *head,int d) {
node *p = head;
while(p->next != NULL) {
if(p->next->x == d) {
node *m = p->next;
p->next = p->next->next;
delete m;
return ;
}
p = p->next;
}
node *q = new node;
q->x = d;
q->next = NULL;
p->next = q;
} int main() {
int n,d;
while(scanf("%d",&n),n) {
node *head = new node;
head->x = -;
head->next = NULL;
while(n--) {
scanf("%d",&d);
insert(head,d);
}
printf("%d\n",head->next->x);
}
return ;
}