这道题我之前想了好几种方法,但是复杂度基本都是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