其他分享
首页 > 其他分享> > 136.只出现一次的数字

136.只出现一次的数字

作者:互联网

**

说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

**
使用快排,复杂度 O(nlogn),不满足题目的时间和空间的复杂度要求

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int flag = 0, i;
        for(i = 0; i < nums.size() - 1; i += 2){
            if(nums[i] != nums[i + 1]){
                flag = 1;
                break;
            }
        }
        if(flag)
            return nums[i];
        else
            return nums[nums.size() - 1];
    }
};

利用 Hash 表,Time: O(n) Space: O(n) 这里就用到了额外的空间
看了下解答有个老哥说不需要额外空间的方法,就往位运算上想
还记得之前在写题解中提到了相同为1,不同为0,这里确实有异或的思想在里面。

异或运算的性质

异或运算有以下三个性质。

1.任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0= a ⊕ 0 = a。
2.任何数和其自身做异或运算,结果是 0,即 a ⊕ a = 0。
3.异或运算满足交换律和结合律,即 a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ ( a ⊕ a )= b ⊕ 0 = b。

所以由于性质3可以对数组中所有的数进行异或运算之后就会等于一个落单的数了。
在这里插入图片描述
复杂度分析

时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。

空间复杂度:O(1)。

所以可以得到代码如下

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(int i = 0; i < nums.size(); i++)
            ret ^= nums[i];
        return ret;
    }
};

标签:一次,return,数字,nums,int,复杂度,异或,136,运算
来源: https://blog.csdn.net/AK416A4/article/details/116596112