只出现一次的数字2——位运算

发布时间:2026/6/9 1:05:38

只出现一次的数字2——位运算 给你一个整数数组nums除某个元素仅出现一次外其余每个元素都恰出现三次 。请你找出并返回那个只出现了一次的元素。示例 1输入nums [2,2,3,2]输出3示例 2输入nums [0,1,0,1,0,1,100]输出100思路由于数组中的元素都在 int即 32 位整数范围内因此我们可以依次计算答案的每一个二进制位是 0 还是 1。具体地考虑答案的第 i 个二进制位i 从 0 开始编号它可能为 0 或 1。对于数组中非答案的元素每一个元素都出现了 3 次对应着第 i 个二进制位的 3 个 0 或 3 个 1无论是哪一种情况它们的和都是 3 的倍数即和为 0 或 3。因此答案的第 i 个二进制位就是数组中所有元素的第 i 个二进制位之和除以 3 的余数。这样一来对于数组中的每一个元素 x我们使用位运算 (x i) 1 得到 x 的第 i 个二进制位并将它们相加再对 3 取余得到的结果一定为 0 或 1即为答案的第 i 个二进制位。细节在 C、Java、Go 等静态语言中int通常固定是32 位4字节。如果你用有符号int最高位第 31 位被硬性规定为符号位。当这个位置是1时系统会按照补码把它识别为负数。在位运算比如按位加法、左移等溢出 32 位时高位会被自动截断符号位自然就生效了。但是PythonPython 3的int是无上限的无限精度。Python 根本没有固定的“第 31 位是符号位”这个概念。当你一直往左移或者做累加时Python 的数字会变成 32 位、64 位甚至 100 位它永远不会自动溢出截断。因此当你在 Python 中模拟 32 位有符号整数运算时如果第 31 位变成了1Python 会认为这只是一个很大的正数$2^{31}$而不会把它当成负数。这就迫使我们必须手动写代码 ans-(1i)。from typing import List class Solution: def singleNumber(self, nums: List[int]) - int: ans0 for i in range(32): totle0 for num in nums: totle(num i)1 if totle%31: if i31: ans-(1i) else: ans | (1 i) return ans print(Solution().singleNumber([2,2,3,2]))

相关新闻