LeetCode热题100-只出现一次的数字

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

题目要求线性时间复杂度,空间复杂度为常量,而且规定除了某个元素出现1次外,其他均出现2次。

首先使用普通解题方法哈希表:

python 复制代码
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        if not nums:
            return -1
        res = {}
        for i in range(len(nums)):
            if nums[i] in res:
                res[nums[i]] = res[nums[i]] + 1
                continue
            res[nums[i]] = 1
        
        for key, value in res.items():
            if value == 1:
                return key

上面方法对于空间复杂度不满足要求,但是是一种容易想到的方式,下面的这种不容易想到就是异或运算。由于其他元素都出现2次,所以这些元素异或最终为0,再和出现1次的元素异或,最后就是出现1次的元素值。

异或运算(^)是二进制运算,满足以下 3 条性质,是解决「只出现一次数字」的核心:

  1. 自身异或为 0 :a ^ a = 0(比如 5^5=0,二进制 101^101=000);
  2. 异或 0 为自身 :a ^ 0 = a(比如 5^0=5,二进制 101^000=101);
  3. 交换律和结合律 :a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c(顺序不影响结果)。
python 复制代码
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for num in nums:
            res ^= num
        return res
相关推荐
zyl76517 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖20 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌20 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
ychqsq21 小时前
234.无题
经验分享·职场和发展
OPEN-F21 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791321 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032221 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!21 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
考研保研资料分享21 小时前
物理保研至中科大:固体物理复习、四场面试与科研追问
面试·职场和发展
2501_926978331 天前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作