136. 只出现一次的数字
2018-11-22 本文已影响1人
闭门造折
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路
无比经典的一道题,但是又想不起来从哪里看到的经典题。
引申经典题:
n个数中,所有数字都是出现偶数次,只有某个数字出现奇数次
用异或做判断,因为a^a=0,0^b=b,所以所有成对的数都会等于0,这样最终只剩下出现奇数次的数了
随便举例
0 — 0000 1001 0101
1 — 0000 1100 0000
2 — 0000 1100 0000
首先数字0和数字1做异或操作,结果为
x — 0000 0101 0101
再和数字2做异或操作,结果为
y — 0000 1001 0101,也就是独立的数字0
性能分析
遍历一遍出结果,时间复杂度O(N),空间复杂度O(1)
具体代码
int singleNumber(vector<int>& nums) {
int res = 0; // 结果集
for(int i = 0; i < nums.size(); i++){ // 遍历所有数
res ^= nums[i]; // 做连续异或运算
}
return res;
}