【LeetCode】136. 单个的数字

问题描述

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/

发布了46 篇原创文章 · 获赞 29 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章