Leetcode - 136只出现一次的数字

136 只出现一次的数字

题目描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

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

示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4

题目给出的接口为:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
       
    }
};

题目分析

说来很巧,如果我最近刚看过一篇类似的文章。如果我没看这篇文章的话,可能这道题会让头疼一阵。
因为这个题的限制条件是不使用额外空间。如果没有这个条件的话,我的方法可能是把所有的数进行一遍排序,遍历一遍就OK了。
但是不允许使用额外的空间,还要求时间复杂度是线性的。我就没有办法了
但是这就不得不提我看到的那篇文章了,一下子给我打开了一条新的思路。这个新思路就是使用异或运算。两个相同的数字的异或结果为0,所以最后剩下的数字一定是只出现过一次的数字。

代码如下:

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

然后我们提交代码,这个题就做出来了。
Leetcode - 136只出现一次的数字
换一种思路有时候题目往往会变简单,但是你有新思路的前提,还是你之前得有一定的积累。