LeetCode 探索初级算法-数组:05 只出现一次的数字-20200317

05 只出现一次的数字-20200317

题目

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

示例

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

说明

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


注意事项

  1. 整数数组非空,按照题目要求,数组最少有三个数字。
  2. 时间复杂度是O(N),最好一个循环内搞定。
  3. 不新开存储空间。

思路一

先对数组排序,然后一次遍历,找到三个相邻指针不一样的,中间那个指针就是。

修改经历:

1. 不是最少三个数字吗,你给我个[1],我心态崩了啊!(第一次提交)

  • 执行用时 :84 ms, 在所有 Python3 提交中击败了74.65%的用户
  • 内存消耗 :15.1 MB, 在所有 Python3 提交中击败了64.46%的用户

2. 虽然没有开辟新的空间,但是这里的内存消耗有点大。不过平台每次提交都会有稍许的差别,在提交一次。(第二次提交)

  • 执行用时 :48 ms, 在所有 Python3 提交中击败了87.08%的用户
  • 内存消耗 :15 MB, 在所有 Python3 提交中击败了93.98%的用户

3. 第二次提交结果说明,大部分答案都集中用时40-100ms,内存更是集中在15MB左右。

心得体会:

排序还是很好用的,先排序再找元素,只要不要索引就行。

最终代码展示:

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

思路二

看到题解的方法,不得不的说大神还是大神。就一个公式 2∗(a+b+c)−(a+a+b+b+c)=c。

最终代码展示:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return 2 * sum(set(nums)) - sum(nums)

思路三

朋友,听说过异或吗?大神就是不一般啊!下面就是大神的思路。

  • a \bigotimes 0=a
  • a\bigotimes 0 = a
  • a\bigotimes a\bigotimes b=0\bigotimes b=b

所以只要将所有的项都异或起来就可以得到只出现一次的项了。Python 3的位操作,参看知识点 Python 中的 位运算符

最终代码展示:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        a = 0
        for i in nums:
            a ^= i
        return a
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章