只出现一次的数字

本文介绍了如何解决LeetCode上的单数元素问题,重点在于使用位运算中的异或操作来找出数组中只出现一次的数字。文中列举了多种解题思路,包括哈希表、集合和列表计数等方法,并详细分析了官方提供的异或运算解法,该方法具有线性时间复杂度且不使用额外空间。通过这个题目,作者认识到异或运算在数组运算中的应用价值,并计划进一步提升在信息技术领域的算法能力。
摘要由CSDN通过智能技术生成

题目

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 题目要求不使用额外空间,官方解法为位运算,即数组中的全部元素的异或运算结果。

    • a⊕b = (¬a ∧ b) ∨ (a ∧¬b)

    • 相异为 1 ,相同为 0

    • 部分运算法则:
      恒等律a ⊕ 0 = a
      自反a ⊕ b ⊕ a = b(当数组全部元素异或时同理)

  • 如不考虑题目要求,想到的思路↓

  1. 使用哈希表,存储数组中每个数字和其出现的次数,遍历数组得到哈希表中的键值对,然后遍历哈希表,找到键值为1的键;
//运行效果:1400+ ms
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        dic = {}
        for i in nums:           
            if i in dic: 
        	    del dic[i]
            else:dic[i] = 1
        for key in dic.keys():
        	return key

类似于第2点使用集合的思路,字典数据结构效果更优,可以方便的找到键,而列表需要有下标

  1. 使用集合,遍历数组,在集合中出现过的数字元素删除,最后留下的就是只出现一次的数字;
//运行效果:1400+ ms
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        a = []
        for i in nums:           
            if i in a: 
        	    a.remove(i)//移除出现i值的第一个
            else:a.append(i)
        return a[0]
  1. 步骤较简单的是直接利用list.count()方法,遍历数组,运算每个数字的出现次数,判断得到出现次数为一次的返回值;
//运行效果:8000+ ms
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        for i in nums:           
            if nums.count(i) == 1: 
        	    return i
  1. 取巧去重set()得到新数组nums1,利用数学方法,结合题意,nums中只有出现两次和一个出现一次的值。
    2*sum(nums1) - sum(nums)
// set()去重
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
		return 2*sum(set(nums)) - sum(nums)

代码

利用异或运算

// 异或
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        ret = 0
        for i in nums:           
            ret ^= i 
        return ret

官方解

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return reduce(lambda x, y: x ^ y, nums)

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

  1. 此题在解时并未想到异或运算,对运算方法的使用理解还不深入,关于涉及数组运算方面继续练习加强;
  2. 对字典、列表数据结构的使用更加熟悉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值