- 标签:位运算、数组
- 难度:中等
描述:给定一个整数数组
要求:找到并返回那个只出现了一次的元素。
说明:
-
$1 \le nums.length \le 3 * 10^4$ 。 -
$-2^{31} \le nums[i] \le 2^{31} - 1$ 。 -
$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_dict = dict()
for num in nums:
if num in nums_dict:
nums_dict[num] += 1
else:
nums_dict[num] = 1
for key in nums_dict:
value = nums_dict[key]
if value == 1:
return key
return 0
-
时间复杂度:$O(n)$,其中
$n$ 是数组$nums$ 的元素个数。 - 空间复杂度:$O(n)$。
将出现三次的元素换成二进制形式放在一起,其二进制对应位置上,出现
将这些二进制位置上出现
注意:因为 Python 的整数没有位数限制,所以不能通过最高位确定正负。所以 Python 中负整数的补码会被当做正整数。所以在遍历到最后
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ans = 0
for i in range(32):
count = 0
for j in range(len(nums)):
count += (nums[j] >> i) & 1
if count % 3 != 0:
if i == 31:
ans -= (1 << 31)
else:
ans = ans | 1 << i
return ans
-
时间复杂度:$O(n \log m)$,其中
$n$ 是数组$nums$ 的长度,$m$ 是数据范围,本题中$m = 32$ 。 - 空间复杂度:$O(1)$。