题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
解题思路
通用版解法可见这里,还可以用数学版解法。
A A A B B B C
和A A A B B B C C C
的差,就是出现了1次的C
的2倍,所以用数学可以解
代码
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return (sum(set(nums)) * 3 - sum(nums)) // 2
Add a k-base xor solution here:
class Solution:
def change_base_to_k(self, num: int, k: int) -> str:
"""
change decimal number to base k
Args:
num: int, decimal integer
k: int
Returns:
res: str, left->right: least->most important
"""
res = ''
while num > 0:
res += str(num % k)
num //= k
return res
def xor_base_k(self, num1: str, num2: str, k: int) -> str:
"""
Xor based on k, add without carry
Args:
num1: str, left->right: least -> most important
num2: str, left->right: least -> most important
k: int
Returns:
res: str, left -> right: least -> most important
"""
if len(num1) == 0:
return num2
if len(num2) == 0:
return num1
res = ''
for i in range(min(len(num1), len(num2))):
d1, d2 = int(num1[i]), int(num2[i])
d = (d1 + d2) % k
res += str(d)
res += num1[i+1:]
res += num2[i+1:]
return res
def base_k_to_decimal(self, num: str, k: int, sign: int) -> int:
"""
Args:
num: string, left -> right: least -> most important
k: int
sign: str, '1' - positive, '2' - negative
"""
res = 0
for digit in num[::-1]:
res = res * k + int(digit)
return res * (1 if sign == '1' else -1)
def singleNumber(self, nums: List[int]) -> int:
res = ''
res_sign = ''
k = 3
for each_num in nums:
if each_num < 0:
sign = '2'
each_num *= -1
else:
sign = '1'
res_sign: str = self.xor_base_k(res_sign, sign, k)
each_num_base_k: str = self.change_base_to_k(each_num, k)
res = self.xor_base_k(each_num_base_k, res, k)
return self.base_k_to_decimal(res, k, res_sign)