Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
大意就是一个数组,只有一个出现了1次,其他都是成双出现
要求时间复杂度O(n),空间复杂度O(1)
解析:如果不要求时间复杂度,此题只需要逐个比较就行。时间复杂度为O(n2/2)
然而在时间复杂度规定O(n)下,需要用到亦或,即两数不相等为1,相等为0,且满足交换律:a^b = b^a,
所以只要将元素全部做亦或处理即可。
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.size() == 0)
return false;
else if (nums.size() == 1)
return nums[0];
int temp = nums[0];
for(int i=1; i<nums.size(); i++)
{
temp ^= nums[i];
}
return temp;
}
};
思考:
1.如果题目要求把一次和两次,对应成基数次和偶数次。
亦或算法依旧可行。
普通算法则需要每个都行比较计数,时间复杂度时间复杂度为O(n2)
2.如果题目把一次和两次调换,则不能直接把亦或换成与。
http://www.cnblogs.com/changchengxiao/p/3413294.html
还有提到了其他的扩展情况。