返回

LeetCode217-只有一个数字出现一次-算法练习系列

前端

LeetCode217:只出现一次的数字

算法思路

异或操作

异或操作符(^)是一种非常有用的位操作符,它可以将两个二进制数的对应位进行异或运算,结果为0或1。异或操作符具有以下性质:

  • 任何数字与自身异或的结果为0。
  • 两个相同的数字异或的结果为0。
  • 两个不同的数字异或的结果不为0。

基于这些性质,我们可以使用异或操作符来找到数组中唯一出现一次的数字。具体步骤如下:

  1. 将数组中的所有数字进行异或运算,并将结果保存在一个变量中。
  2. 此时,变量中存储的值就是唯一出现一次的数字与其他所有数字异或的结果。
  3. 我们再将变量中的值与数组中的每个数字进行异或运算,就可以得到唯一出现一次的数字。

位操作

位操作是另一种非常有用的操作,它可以对二进制数的各个位进行操作。我们可以使用位操作来找到数组中唯一出现一次的数字。具体步骤如下:

  1. 将数组中的所有数字进行二进制表示,并将它们存储在一个数组中。
  2. 然后,我们可以对数组中的每个二进制数字的对应位进行按位异或运算。
  3. 最后,我们将按位异或运算的结果转换为十进制,就可以得到唯一出现一次的数字。

代码实现

Python

def single_number(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    result = 0
    for num in nums:
        result ^= num
    return result

C++

int singleNumber(vector<int>& nums) {
    int result = 0;
    for (int num : nums) {
        result ^= num;
    }
    return result;
}

Java

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

算法分析

时间复杂度

异或操作和位操作都是非常高效的操作,因此这两种方法的时间复杂度都是O(n),其中n是数组的长度。

空间复杂度

异或操作和位操作都不需要使用额外的空间,因此这两种方法的空间复杂度都是O(1)。

结语

LeetCode 217题是一道经典的算法题,它考验了我们的算法设计能力和对位操作的理解。通过这篇文章,我们介绍了两种不同的方法来解决LeetCode 217题,分别是异或操作和位操作。这两种方法都是非常高效的,并且可以在线