Add to List 136. Single Number (找到单独的数) by Python

题目:
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]
posted @ 2017-06-18 15:47  佳贵  阅读(280)  评论(0编辑  收藏  举报