题目: Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 给一个数列,数列里出了一个单独的数其余的数都出现了两次,找出这个单独的数,用最节约时间内存的方式完成 思路: 找一个数用最快的方式在数列里找到我首先想到的就是二分查找(当然可能还有别的方式)。 所以我想用二分查找的方式找到这个单独的数,但是二分查找基于数列有序的时候,所以首先把数列快速排序(本想写个快排,但是懒,直接用sort了) 对于排序好的数列我想到的是可以找到中间的数,然后看它是不是和左右相等,来判断单独的数在中间的左边还是右边。 首先整个数列的长度必然是奇数个(因为只要一个单独数),所以我使用ln = len(b)//2就可以找到中间的数的下标,这样它就把数列分成相等长度的两部分: 这里就出现了两种情况:1是左右两边的片段长度都是奇数,2是左右两边的片段长度都是偶数 1,当都为奇数时: 如果中间数和左边相等,那么其右边必然为奇数个数的序列,那么单独数必然在右边 eg:[-1,-1,0,0,1,1,2] 如果总件数和右边相等,那么其左边必然为奇数个数的序列,那么单独数必然在左边 eg:[-2,-1,-1,0,0,1,1] 2,当都为偶数时: 如果中间数和左边相等,那么其右边必然为偶数个数的序列(没有单独数),那么单独数必然在左边 eg:[-1,0,0,1,1] 如果中间数和右边相等,那么其左边必然为偶数个数的序列(没有单独数),那么单独数必然在右边 eg:[-1,-1,0,0,1] 共同的,如果中间数和左右都不相等,那么就是单独数了 根据这个用循环或者迭代就可以找到单独数,注意的是判断跳出条件,当找到中间数或数列只有一个数的时候就可以跳出了 结果: class Solution(object): def singleNumber(nums): """ :type nums: List[int] :rtype: int """ b = sorted(nums) while True: # 中间下标 ln = len(b)//2 # 如果只剩下一个值 if ln == 0: return b[0] # 判断奇数偶数 if ln % 2 == 0: # 偶数 if b[ln] == b[ln+1]: b = b[ln+2:] elif b[ln] == b[ln-1]: b = b[:ln-1] else: return b[ln] else: # 奇数 if b[ln] == b[ln+1]: b = b[:ln] elif b[ln] == b[ln-1]: b = b[ln+1:] else: return b[ln]