【雪中明月】136. 只出现一次的数字——Python多解法

📃题目

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

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

🪄解法

1.二次删除法

使用异常处理来返回,不太正常

# 这个remove耗时惊人,好在不超时
def singleNumber1(nums):
    for i in set(nums):
        # 两次remove
        nums.remove(i)
        try:
            # 找不到第二个i啊,那就返回吧
            nums.remove(i)
        except:
            return i

2.排序找人

排序找不相同的

def singleNumber2(nums):
    # 排序下
    nums = sorted(nums)

    for i in range(0, len(nums), 2):
        # 用于处理单独的数在最后一个的情况
        if i == len(nums) - 1:
            return nums[i]
        # 如果相邻不同,就返回
        if nums[i] != nums[i + 1]:
            return nums[i]

3.哈希表法

很快啊

# 哈希表法    
def singleNumber3(nums):
    dict = {}

    for i in nums:
        if i in dict:
            dict[i] += 1
        else:
            dict[i] = 1
            
    for i in dict:
        if dict[i] == 1:
            return i

4.异或法

以上的都是不符合题意的
要求是你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
只有这样使用异或来解决

# 异或法
def singleNumber4(nums):
    a = 0
    for i in nums:
        a ^= i
    return a

❤️结尾

个人站点:点击查看
CSDN主页:点击查看
Leetcode:点击查看
不定期更新Leetcode题解(可能还有其它杂乱内容),欢迎关注!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值