题目如下:
点此读题
很幸运,选到了一道秀得我头皮发麻的题。
题目要求的是从一个数组中选出只出现了一次的数字,第一反应就是用求和来解,然而仔细想想好像没有什么卵用。你不能证明最后的数组和与那个只出现了一次的整数有什么关系,随随便便来个偶数数组就能轻而易举打破这个假说。
接着就按老思路,看看能不能以排序或者排序的改进方法来解决。发现还是很难,因为要求线性时间复杂度,而排序算法大部分平均复杂度都达到了O(n^2),显然是不行的。遍历常数次的话又不能保证能有个满意的顺序,更何况还有个空间限制。陷入停滞。
这个时候就要想一想一些别的奇技淫巧了。
这道题需要用到的是异或的关系(一开始完全没有这个想法。。。真的惭愧)。异或中,两个数相同则返回0,不同则返回1。这样就极大简化了题目
若数组中的任意一个数都能在数组找到另一个相同的数,两两异或为0,n个0异或的结果也是0,所以数组中所有的数异或的结果为0。若最后结果不为0,那么最后的结果一定是只出现了一次的数,所以想的焦头烂额最后的结果几行就搞掂了:
int singleNumber(vector<int>& nums) {
int sign = 0;
for(int i = 0; i < nums.size(); i++){
sign = sign ^ nums[i];
}
return sign;
}
看来姿势水平不够,还是要学习一个。尤其是做题的时候各种数据结构和位运算一定要记得清清楚楚(#.#)