返回
算法81题系列:轻松解决只出现一次的数字
前端
2023-10-15 07:39:13
前言
欢迎来到前端算法必刷题系列的第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题目的理解,是一期不可错过的精彩内容。