137. 只出现一次的数字 II(中)

题目

  • 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
    你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

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

法一、排序

class Solution:  
    def singleNumber(self, nums: List[int]) -> int:  
        # 对列表进行排序  
        nums.sort()  
        n = len(nums)  
        # 遍历排序后的列表  
        for i in range(n):  
            # 如果当前数字与前一个数字不同,或者已经是列表的倒数第二个元素,则它可能是只出现一次的数字  
            if i == 0 or nums[i] != nums[i - 1]:  
                # 检查当前数字是否连续出现了三次  
                if i < n - 2 and nums[i] == nums[i + 1] == nums[i + 2]:  
                    # 如果是,则跳过接下来的两个数字  
                    i += 2  
                else:  
                    # 如果不是出现了三次,返回当前数字  
                    return nums[i]  
        # 如果遍历完整个列表都没有找到只出现一次的数字,则返回最后一个数字(理论上不应该出现这种情况)  
        return nums[-1]  

法二、位运算

  • 不太理解:有限状态自动机
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        ones, twos = 0, 0
        for num in nums:
            ones = ones ^ num & ~twos
            twos = twos ^ num & ~ones
        return ones
posted @ 2024-02-14 20:47  Frommoon  阅读(9)  评论(0编辑  收藏  举报