HDU 2095 find your present (2) 动态链表

解题报告:输入一个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 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3258532.html