LeetCode

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;
}
上一篇下一篇

猜你喜欢

热点阅读