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

1 #include<cstdio> 2 struct node { 3 int x; 4 node *next; 5 }; 6 void insert(node *head,int d) { 7 node *p = head; 8 while(p->next != NULL) { 9 if(p->next->x == d) { 10 node *m = p->next; 11 p->next = p->next->next; 12 delete m; 13 return ; 14 } 15 p = p->next; 16 } 17 node *q = new node; 18 q->x = d; 19 q->next = NULL; 20 p->next = q; 21 } 22 23 int main() { 24 int n,d; 25 while(scanf("%d",&n),n) { 26 node *head = new node; 27 head->x = -1; 28 head->next = NULL; 29 while(n--) { 30 scanf("%d",&d); 31 insert(head,d); 32 } 33 printf("%d ",head->next->x); 34 } 35 return 0; 36 }