题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
这题我看有很多朋友的解法是新建一个map/dictionary来储存所有出现次数,但是其实不用额外储存也是可以做的。
这题首先因为他明确写了,只有我们需要找到的两个数字,出现了一次,所以我们其实可以首先将收到的数组进行排序,这样,只出现一次的数字,他的前一位和后一位都和他不相等,而出现两次的数字,总能在前面或者后面找到和他相同的数字。但是需要注意的是,数组的第一位和最后一位数字我们需要单独拿出来考虑,因为他们分别不存在前一位和后一位。
所以这题解法分为以四步:
- 将收到的数组排序
- 检查数组第一个数字,是不是和第二位相等,不等时,他是我们需要找到的两个数之一。
- 从第二位数开始,到倒数第二位数结束,我们比较当前数字是否和他前一位或后一位相等,只要都不等,则这个数是我们需要找到的数
- 检查数组倒数第一个数字,是不是和倒数第二位相等,不等时,他是我们需要找到的两个数之一。
下面时详细的代码:
class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write code here result = [] if not array or len(array) == 0: return result array = sorted(array) if(array[0] != array[1]): result.append(array[0]) for i in range(1,len(array)-1): if array[i] != array[i-1] and array[i] != array[i+1]: result.append(array[i]) if(array[-2] != array[-1]): result.append(array[-1]) return result