Leetcode 136.只出现一次的数字Ⅰ

一、题目要求

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

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

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

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

二、解题思路

位操作:异或

  • 异或运算符”^”。
  • 若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。
  • 即 0 ^ 0=0,0 ^ 1=1, 1 ^ 0=1,1 ^ 1=0。
运算 解释
0 ^ 0 = 0, 0 ^ 1 = 1 0 异或其他任何数 = 任何数
1 ^ 0 = 1, 1 ^ 1 = 0 1 异或其他任何数 = 任何数取反
a ^ a = 0 任何数异或任何数 = 0
a ^ b ^ c = a ^ c ^ b 异或运算符合交换律
(a ^ b) ^ c = a ^ ( b ^c ) 异或运算符合结合律
  • 根据以上异或性质,我们只需要创建一个初始值为 0 的变量,并用这个变量不断与数组中每一个值相互异或
  • 由于数组中只有一个数值是单个存在的,其他都有两个相同的数值
  • 因此,该题的数组运算可表示为
  • a ^ a ^ b ^ b ^ c … = 0 ^ 0 ^ c
  • 则最后留下来的数值即为单个存在的数值

代码如下:

class Solution 
{
    
    
public:
    int singleNumber(vector<int>& nums)
    {
    
    
    	// 创建一个结果变量 result 为 0;
        int result = 0;
        // 遍历 nums 数组中的每一个元素, 并将其赋值给 e
        for (auto e : nums)
        	// 每次将 result 与 e 相异或
            result ^= e;
        return result;
    }
};

Good Luck!

猜你喜欢

转载自blog.csdn.net/weixin_46992165/article/details/126426502