LeetCode 算法题库【137】——只出现一次的数字Ⅱ

只出现一次的数字Ⅱ

题目描述:

timu

解题思路:

python3

  • 第一种:排序查找法。这个方法是根据原先的那道题:只出现一次的数字Ⅰ,进行稍微的改进,方法和思路都是一样的,可以参考。
  • 唯一的改变就是,之前的题目中,相同数字的出现次数为2次,而这次是3次,所以我们排完序之后,只需要每隔3位进行查找,就能很快锁定这个唯一的数字。
  • 时间复杂度:O(N)
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        nums.sort()
        for i in range(0, len(nums) - 1, 3):
            if nums[i] != nums[i + 1]:
                return nums[i]
        return nums[-1]

1

  • 第二种:纯数学方法。这个方法和之前的那道题的第二种方法也是一样的,也是进行了小改动。
  • 这里我们去重之后求和,因为重复数字重复次数是3次,所以我们就将该和乘3,再减去原列表之和,最后会剩下两倍的唯一数组,这时只需要整除2就可以得到啦。
  • 时间复杂度:O(N)
class Solution2:
    def singleNumber(self, nums: List[int]) -> int:
        result = (3 * sum(set(nums)) - sum(nums)) // 2
        return result

2

  • 第三种:内置模块查找法。这里用到了collections容器数据类型中的模块Counter,详情可以点进链接。
  • 这个模块能够直接计算出对应的数字在字典中的个数,所以我们只要查找出这个数在nums字典中只出现过一次,则这个数就是这个唯一的数。
  • 时间复杂度:O(N)
from collections import Counter

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        dictionary = Counter(nums)
        for i in dictionary.keys():
            if dictionary[i] == 1:
                return i

3

  • 第四种:位运算法。
  • 时间复杂度:O(N)
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        ones = temp = 0
        for i in nums:
            ones = ~temp & (ones ^ i)
            temp = ~ones & (temp ^ i)
        return ones

4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值