Leetcode 136 利用异或运算寻找出现奇数次的数

本文介绍了一种解决LeetCode上“Single Number”问题的高效算法,通过使用异或运算找到列表中仅出现一次的数字。异或运算的特点使它能够巧妙地筛选出目标数字,即使在大量重复数据中也能快速定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在水Leetcode的简单题时,遇到一道题让我从一个数字列表中找出只出现一次的数,其他的数均出现两次。

题目链接:https://leetcode-cn.com/problems/single-number/description/

我的思路就非常水了,排个序,左右比较一下,然后总感觉还有更好的方法,就去搜了一下,果然,又学到了。网上的大佬都用异或运算来解决道题目。

异或的特点:

a xor b xor a == b

利用这个特点,只要拿第一个数字一路异或下去,就能剩下只出现一次的数字,进一步说,可以得到出现奇数次的数字(前提是其他数字都出现偶数次)

上个代码:

#encoding=utf-8
import numpy as np

# (a xor b) xor a = b
# a xor b xor c xor a xor c
#=(a xor (b xor c) xor a) xor c
#=(b xor c) xor c
#=b
#正好剩下出现奇数次的数
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        a = nums[0]
        for i in range(1, n):
            a = a ^ nums[i]
        return a

 

<think>嗯,用户问的是异或运算是什么。首先,我需要回忆一下异或运算的基本定义。异或,全称是“异或运算”,英文是Exclusive OR,通常缩写为XOR。记得在逻辑运算中,它和AND、OR、NOT这些类似,但又有自己的特点。 接下来,我应该从逻辑门的角度来解释异或运算异或门有两个输入,当且仅当两个输入不同的时候,输出才是真,也就是1。如果两个输入相同,不管是0还是1,输出都是0。这样的话,真值表应该是什么样的呢?对的,0 XOR 0是0,0 XOR 1是1,1 XOR 0是1,1 XOR 1是0。这个真值表需要列出来,帮助用户更直观地理解。 然后,学符号方面,异或运算有不同的表示方式。在学或计算机科学中,常用的符号有⊕、^,或者用文字XOR来表示。比如A XOR B可以写成A ⊕ B,或者在编程中用^符号,像A ^ B。需要提到不同场景下可能使用的符号差异,避免用户混淆。 接下来,应该解释异或运算的性质。比如交换律和结合律,异或运算是否满足这些?对的,交换律成立,A ⊕ B = B ⊕ A;结合律的话,(A ⊕ B) ⊕ C = A ⊕ (B ⊕ C),这也是成立的。另外,还需要提到一些特殊的性质,比如任何与自身异或结果为0,像A ⊕ A = 0;还有和0异或的结果是自身,A ⊕ 0 = A。这些性质在编程中常被用来做变量交换或者据校验等。 应用方面,用户可能想知道异或运算有什么实际用途。比如在计算机中的位运算异或可以用来交换两个变量的值而不需要临时变量,这个技巧挺有趣的。另外,在加密算法中,异或也经常被使用,因为它具有可逆性,两次异或同一个值就能恢复原据。还有错误检测与纠正,比如奇偶校验或者RAID5中的磁盘冗余,都利用异或的特性。 用户可能的背景可能包括编程或计算机基础,所以需要举一些例子,比如变量交换的代码片段,或者简单的加密解密过程。不过用户没有明确说明是否需要代码示例,但至少应该提到这些应用场景,让用户知道异或运算的重要性。 另外,可能需要考虑用户是否有更深层的需求,比如学习异或运算是为了理解某个算法,或者解决一个具体的问题。比如在密码学中的流密码常用异或,或者在据结构中的某些操作。但用户的问题比较基础,所以先集中在基本定义和常见应用上。 还要注意避免使用过于专业的术语,保持解释的通俗易懂。比如用“输入不同则输出1,相同则输出0”这样的描述,比严格的逻辑表达式更直观。同时,确保学表达式用LaTeX正确呈现,比如真值表部分可以用表格形式,但根据系统指令,行内公式需要用$...$,独立公式用$$...$$。不过在这里可能需要用文字描述,或者用简单的列举。 最后,检查是否有遗漏的重要点。比如异或运算在二进制加法中的应用,因为不带进位的加法其实就是异或操作,这在计算机的加法器设计中是一个基础概念。这可能也是用户想了解的一部分,但可能属于进阶内容,如果用户需要更深入的解释,可以后续补充。 总结一下,回答的结构应该先定义异或运算,然后真值表,符号表示,性质,应用场景。确保每个部分清晰,用例子帮助理解,并连接实际应用,让用户明白异或运算的价值和用途。</think>异或运算(Exclusive OR,简称XOR)是一种基础逻辑运算,在计算机科学、密码学等领域有广泛应用。以下从定义、规则、性质到应用逐步说明: --- ### 一、基本定义 异或运算作用于两个**二进制位**(0或1),规则为: - 当**两个输入不同**时,输出1; - 当**两个输入相同**时,输出0。 学符号表示为: $$ A \oplus B $$ 或编程中常见的符号 `A ^ B`。 --- ### 二、真值表 | 输入A | 输入B | 输出(A ⊕ B) | |-------|-------|---------------| | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 | --- ### 三、核心性质 1. **交换律**:$A \oplus B = B \oplus A$ 2. **结合律**:$(A \oplus B) \oplus C = A \oplus (B \oplus C)$ 3. **自反性**:$A \oplus A = 0$(相同异或结果为0) 4. **与0运算**:$A \oplus 0 = A$(任何与0异或结果不变) 5. **可逆性**:若 $C = A \oplus B$,则 $A = C \oplus B$(加密/解密的基础) --- ### 四、典型应用场景 #### 1. 变量交换(无需临时变量) ```python a = 5 # 二进制 101 b = 3 # 二进制 011 a = a ^ b # a = 101 ^ 011 = 110 (6) b = a ^ b # b = 110 ^ 011 = 101 (5) a = a ^ b # a = 110 ^ 101 = 011 (3) ``` 通过三次异或操作,实现`a`和`b`值的交换。 #### 2. 简单加密 对据$M$用密钥$K$异或加密,生成密文$C$: $$ C = M \oplus K $$ 解密时再次异或$K$即可还原: $$ M = C \oplus K $$ #### 3. 错误检测与纠错 - **奇偶校验**:通过异或计算二进制串的奇偶性,检测传输错误。 - **RAID 5**:磁盘阵列中使用异或生成冗余据,实现故障恢复。 #### 4. 计算机加法器 二进制加法中,**不考虑进位**的加法本质是异或运算: $$ \text{和} = A \oplus B $$ 进位则由逻辑与运算处理。 --- ### 五、延伸理解 异或运算的底层本质是“**差异判断**”——只有当输入存在差异时才输出真值。这一特性使其在算法优化、硬件设计等领域成为关键工具。例如: - 图形学中用于快速切换显示内容(差异部分更新); - 算法题中用于找出组中唯一出现奇数次字(如LeetCode 136题)。 如果需要进一步了解具体场景的实现细节,可以深入探讨!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值