题源
136.只出现一次的数字
题目描述
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
思考
思考一
这个问题可以使用位运算来解决,具体方法是利用异或运算的性质
1.一个数与自己异或的结果是0
这也很好理解,因为0与0异或为0,0与1异或为1,所以一个数与自己
异或的结果是0,大家可以自行举例
2.任何数与0异或的结果是它自己。
由于除了一个数以外,其他数都成对出现,我们可以把所有数异或起
来,最后剩下的就是只出现一次的那个数。
这个也很好理解,同0同1异或皆是0,最终答案也必然是0
示例:
实现思考一代码
class Solution {
public:int singleNumber(vector<int>& nums) {int result = 0;for (int num : nums) {result ^= num;}return result;}
};
时间复杂度
一个for()时间复杂度为O(n)
综合时间复杂度为O(n)
方法补充
根据本题对于时间复杂度和空间复杂度的要求,异或的方法可谓是最佳的