美文网首页算法提高之LeetCode刷题Leetcode模拟面试
[LeetCode][Python]137. 只出现一次的数字

[LeetCode][Python]137. 只出现一次的数字

作者: bluescorpio | 来源:发表于2019-07-15 22:35 被阅读0次

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

说明:

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

示例 1:

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

输入: [0,1,0,1,0,1,99]
输出: 99

思路:

  1. 数学方法:
    3*(a+b+c)- (a+a+a+b+b+b+c) = 2c
  2. 别人的思路:
    定义两个变量ones和twos,当遍历nums的时候,对于重复元素x,第一次碰到x的时候,我们会将x赋给ones,第二次碰到后再赋给twos,第三次碰到就全部消除。赋值和消除的动作可以通过xor很简单的实现。
    x&~x就完成了消除操作
    第一次出现x记录在ones中,并且此时twos应为0;第二次出现x记录在twos中,同时ones置为0,;第三次出现x,则ones,twos均重置为0
#! /usr/bin/env python
#coding=utf-8
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return (3 * sum(set(nums)) - sum(nums)) / 2

    def singleNumber2(self, nums):
        ones, twos = 0, 0
        for num in nums:
            ones = (ones^num)&~(twos)
            twos = (twos^num)&~(ones)
        return ones

相关文章

网友评论

    本文标题:[LeetCode][Python]137. 只出现一次的数字

    本文链接:https://www.haomeiwen.com/subject/axcakctx.html