返回

算法81题系列:轻松解决只出现一次的数字

前端

前言

欢迎来到前端算法必刷题系列的第81期,本期我们来解决一道LeetCode题——只出现一次的数字。这是一道简单题,考察了异或运算的基础知识。相信大家都能轻松掌握。

题目

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

示例 1:

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

示例 2:

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

异或运算

异或运算是一个非常重要的位运算符,它有两个操作数,每个操作数都是一个二进制数。异或运算的结果也是一个二进制数,其每一位的值取决于相应位置的两个操作数的异或结果。

异或运算的运算规则如下:

  • 若两个操作数的对应位均为0,则结果为0。
  • 若两个操作数的对应位均为1,则结果为0。
  • 若两个操作数的对应位一为0另一为1,则结果为1。

异或运算具有以下几个性质:

  • 交换律:A XOR B = B XOR A
  • 结合律:(A XOR B) XOR C = A XOR (B XOR C)
  • 自反性:A XOR A = 0
  • 吸收律:A XOR 0 = A
  • 异或运算可以用来对一个数字进行取反。

解题思路

这道题的解题思路非常巧妙,利用异或运算的性质,我们可以轻松地解决这个问题。

首先,我们定义一个变量result,并将其初始化为0。然后,我们遍历数组,依次将每个元素与result进行异或运算。

由于异或运算具有结合律和交换律,因此我们可以将数组中的元素任意顺序进行异或运算。

当我们遍历完数组后,result的值就是那个只出现一次的元素。

代码示例

public int singleNumber(int[] nums) {
    int result = 0;
    for (int num : nums) {
        result ^= num;
    }
    return result;
}
def singleNumber(nums):
    result = 0
    for num in nums:
        result ^= num
    return result

复杂度分析

  • 时间复杂度:O(n),其中n是数组的长度。
  • 空间复杂度:O(1),因为我们只需要一个变量result来存储结果。

总结

这道题是一道非常经典的LeetCode题,考察了异或运算的基础知识。我们使用异或运算巧妙地解决了这个问题,提供详细的解决方案并附有清晰的代码示例。本期不仅帮助您掌握异或运算的用法,还能加深您对LeetCode题目的理解,是一期不可错过的精彩内容。