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;
}
};
然后我们提交代码,这个题就做出来了。
换一种思路有时候题目往往会变简单,但是你有新思路的前提,还是你之前得有一定的积累。