这道题我之前想了好几种方法,但是复杂度基本都是n^2,看评论才知道的算法,而且题目提示了,考察的知识点是位运算,但是比较郁闷的是,如果要返回的结果是负数,答案还是错的,但是结果转化成二进制后每一位的01是完全一致的,所以在负数的时候还需要考虑正负转换,另外把自己写的三种解法也贴在后面吧,用jupyter写的,三种解法思路基本是一样的,贴一下,记录一下自己的代码。
题目:数组中只出现一次的数(其它数出现k次) 描述:给定一个长度为 n 的整型数组 arr 和一个整数 k(k>1) 。 已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。 请返回只出现了 1 次的数。 数据范围: 1≤n≤2∗10^5,1<k<100 , -210^9≤arr[i]≤210^9 进阶:时间复杂度 O(32n),空间复杂度 O(1)
```#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param arr int整型一维数组
# @param k int整型
# @return int整型
#
class Solution:
def foundOnceNumber(self , arr: List[int], k: int) -> int:
# write code here
sum = 0
startBit = 31
for i in range(31,-1,-1):
b = 0
for j in arr:
b += (j>>i) & 1
sum = 2*sum + b%k
if (i == 31) & (sum == 1):
startBit = -1
if (startBit == -1) & (sum == 1):
sum = 0
elif (startBit == -1) & (sum == 0):
startBit = i
if (startBit != 31):
sum = sum - pow(2,startBit+1)
return sum
#其它解法:
#解法1:
arr,n = [5,4,1,1,5,1,5],3
cur = []
def iCount(i,cur):
if len(cur) == 0:
return 0
for e in cur:
if i == e['number']:
e['count'] += 1
return e['count']
return 0
for i in arr:
count = iCount(i,cur)
if count == 0:
cur.append({'number':i,'count':1})
elif count == n:
cur.remove({'number':i,'count':n})
print(cur[0]['number'])
#解法二
arr,n = [5,4,1,1,5,1,5],3
for i in range(len(arr)):
isDouble = False
for j in range(len(arr)):
if (arr[i] == arr[j]) & (i != j):
isDouble = True
break
if not isDouble:
print(arr[i])
break
#解法三
arr,n = [5,4,1,1,5,1,5],3
i = 0
while i < (len(arr)):
cur_count = 1
j = i + 1
while j < (len(arr)):
if(arr[i] == arr[j]):
cur_count += 1
arr.pop(j)
j -= 1
if(cur_count == n):
arr.pop(i)
break
j += 1
if cur_count == 1:
print(arr[i])
break