http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=23php
[题目涉及的相关理论与算法]
位操做与位运算ios
[题目中须要注意的地方]
就是对于大数据查找等处理,虽然要求很简单,可是常规的思路解决不了问题。。。由于会超出时间。算法
[思路过程]
一开始觉得真是大水题了。。题目要求真的很简单,就是对一组数据找出配不成对的一个数,我一开始的思路就是创建一个list容器,而后每次查找,只要是新数据就加到尾部,是出现过的数据就删除掉原来的数据。这样,在循环结束后只剩下题目要求的那个数。代码写出来以下:数组
#include<iostream> #include<list> #include<algorithm> using namespace std; void casesolve(int n) { list<long long> table; int numLoop = 2*n-1; long long num; while((numLoop--) != 0) { cin>>num; list<long long>::iterator key; key = find(table.begin(),table.end(),num);//find方法。 if( key != table.end()) //这里就是核心部分,若是老数据,则返回的迭代器就不是末尾。 { table.erase(key); } else table.push_back(num);//新数据则加入到列表尾部。 } cout<<table.front()<<endl;//最后只剩下要求的数据。 } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); int n; cin>>n; while(n != 0) { casesolve(n); cin>>n; } //fclose(stdin); //fclose(stdout); return 0; }
而后上面的代码提交以后,就是LTE。。我设想多是find方法效率低?就打算用数组写一个,本身写查找函数,可是仍是以为基本上效率也不会差太多,也多是erase的操做问题,可是按照个人算法,若是不使用erase不行。
最后以为在我接触的东西中,基本上没有好办法处理了。。这时去网上查了一下,而后发现原来,是能够用位的异或运算解决的! 好强大的想法,我以前是不管如何不能想到的,异或运算有以下的重要性质:函数
这三条性质正好能够解决此题,设想输入数据后,全部成对的数据都会和本身异或掉,变成零,而后剩下的数据与0异或仍是本身。因此将每次的结果异或后,最后剩下的就是没有成对的数!
代码以下:oop
[代码]大数据
#include<iostream> using namespace std; void casesolve(int n) { long long result=0,temp=0; int numLoop = 2*n-1; while((numLoop--)!=0) { cin>>temp; result = result ^ temp; //这就是核心的部分,真是很是的巧妙! } cout<<result<<endl; } int main() { int n; cin>>n; while(n != 0) { casesolve(n); cin>>n; } return 0; }
[尾声]
选对了方法以后,就会以为一会儿变得很简单了,今天虽然这道题很简单,可是对个人思路有了很大的启发。考虑问题的处理上,不少时候能够尝试跳出惯性的框框,会一会儿豁然开朗!
spa