题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

这题我看有很多朋友的解法是新建一个map/dictionary来储存所有出现次数,但是其实不用额外储存也是可以做的。
这题首先因为他明确写了,只有我们需要找到的两个数字,出现了一次,所以我们其实可以首先将收到的数组进行排序,这样,只出现一次的数字,他的前一位和后一位都和他不相等,而出现两次的数字,总能在前面或者后面找到和他相同的数字。但是需要注意的是,数组的第一位和最后一位数字我们需要单独拿出来考虑,因为他们分别不存在前一位和后一位。
所以这题解法分为以四步:

  1. 将收到的数组排序
  2. 检查数组第一个数字,是不是和第二位相等,不等时,他是我们需要找到的两个数之一。
  3. 从第二位数开始,到倒数第二位数结束,我们比较当前数字是否和他前一位或后一位相等,只要都不等,则这个数是我们需要找到的数
  4. 检查数组倒数第一个数字,是不是和倒数第二位相等,不等时,他是我们需要找到的两个数之一。

下面时详细的代码:

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