【LeetCode】136. 单个的数字

本文探讨了如何在给定的非空整数数组中找到仅出现一次的元素,该元素在数组中所有其他元素都出现了两次。文章提供了三种不同的解决方案,包括使用计数器、列表处理以及异或运算。特别强调了异或运算方法不仅具有线性时间复杂度,而且不使用额外内存,满足LeetCode题目要求。

摘要生成于 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?

给定一个非空整数数组,每个元素出现两次,只有一个元素例外。找到那一个。
注意:
你的算法应该具有线性运行时复杂度。你可以在不使用额外内存的情况下实现它吗?

输入: [2,2,1]
输出: 1

输入: [4,1,2,1,2]
输出: 4

 

Python 实现

第一种方法:最直接的思路,使用计数器计算数组中每个元素出现的个数,返回仅出现一次的那个元素

(但是如果输入数组很大的话,这种方法可能会消耗很多的额外内存)

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        cnt = {}
        for num in nums:
            if num in cnt:
                cnt[num] += 1
            else:
                cnt[num] = 1
        for num in cnt.keys():
            if cnt[num] == 1:
                return num

第二种方法:根据题目的意思,重复的元素只会出现两次,剩下唯一的一个元素只出现一次,所以我们可以用一个列表来处理,重复出现的元素从列表中移除,最后剩下的必然是唯一的只出现一次的那个元素。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        single = []
        for num in nums:
            if num in single:
                single.remove(num)
            else:
                single.append(num)
        return single[0]

第三种方法:思路和第二种相似,不过能够避免使用额外的内存,就是使用 异或 运算,重复出现的元素经过两次异或运算后相互抵消,于是最后的运算结果的值就是唯一的那个只出现一次的元素。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ret = 0
        for num in nums:
            ret ^= num
        return ret

链接:https://leetcode.com/problems/single-number/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值