leetcode 136. Single Number 解法 python

本文详细解析了LeetCode中寻找唯一元素的问题,提供了三种解题思路:使用Counter类统计频率、利用集合操作筛选单例元素、以及采用异或运算实现高效查找。通过实例演示了每种方法的具体应用。

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

一.问题描述

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1

Example 2:

Input: [4,1,2,1,2]
Output: 4

二.解题思路

这道题可以用python的Counter类来处理,之后就有每个字符的出现次数,然后遍历count找出现次数为1的值就好了。

也可以自己写,用集合,遍历nums,判断当前num是否在集合里面,在的话从集合删掉,不在的话加进去。

因为只有一个数只出现一次,其他数出现两次,因此最后只会剩一个数在集合中。

还有一个比较高级的算法,

就是用异或运算,异或运算满足交换律和结合律,两个相同的数异或是0,把nums里的所有数拿出来异或,最后肯定只剩线落单的那一个。

之后有高效算法会更新。

更多leetcode算法题解法请关注我的专栏leetcode算法从零到结束或关注我。

欢迎大家一起套路一起刷题一起ac。

三.源码

1.Counter类

from collections import Counter
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        counter=Counter(nums)
        return [key for key in counter if counter[key]==1][0]


# or
from collections import Counter
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        counter=Counter(nums)
        for key in counter:
            if counter[key]==1:return key

2.set

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        counter=Counter(nums)
        for key in counter:
            if counter[key]==1:return key
        count=set()
        for num in nums:
            if num in count:count.remove(num)
            else:count.add(num)
        return list(count)[0]

3.异或

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res=0
        for num in nums:
            res^=num
        return res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值