[leetcode] 136-只出现一次的数字

80 阅读1分钟

题目描述

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

说明:

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

示例 1:

输入: [2,2,1]

输出: 1

示例 2:

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

输出: 4

解法

法1

直观想法用一个list保存已经出现过的数,每读取一个就判断list里有没有。有就删掉,没有就丢进去。

代码如下:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        stack = []
        for i in nums:
            if i not in stack:
                stack.append(i)
            else:
                stack.remove(i)
        return stack[0]

法2

排序之后,单独的数要么在两头要么夹在两对数之间,分类讨论一下即可。

代码如下:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums = sorted(nums)
        if len(nums) >= 5:
            if nums[0] != nums[1]:
                return nums[0]
            elif nums[-1] != nums[-2]:
                return nums[-1]
            else:
                for i in range(0, len(nums) - 2):
                    if nums[i] < nums[i + 1] < nums[i + 2]:
                        return nums[i + 1]
        elif len(nums) == 3:
            return nums[0] if nums[1] == nums[2] else nums[2]
        else:
            return nums[0]

法3

2个相同的数联想到异或的性质。如果全部异或数组中的数,如果有2个就对最后的结果没有影响(两次异或回去了),最后留下来的正好是落单的数。

代码如下:

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