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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix