剑指offer - 数组中只出现过一次的数字 - python

91 阅读1分钟

题目描述:

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

思路:

这道题和下面的两道题本质上是一样的,因此同样的方法仍可使用。

剑指offer - 字符流中第一个不重复的字符 - python
剑指offer -第一个只出现一次的字符位置 - python

  • 法1: 首先看数组中有哪些数字,然后依次查找它们在数组中的个数,如果个数为1则保存,最后返回保存的结果即可。
  • 法2: 利用dict保存数组中的数字和出现的次数,然后找到值为1对应的键即可
  • 法3: 先对数组进行排序,除了两个只出现一次的数字外,其余的数字都出现了两次,因此可以通过比较具体位置左右的数来进行判断它属于哪一类

AC代码

法1

# -*- coding:utf-8 -*-
class Solution:
    def FindNumsAppearOnce(self, array):
        # write code here
        a = list(set(array))
        a.sort(key = array.index)
        
        r = []
        for i in a:
            count = 0
            for n in array:
                if i == n:
                    count += 1
            if count == 1:r.append(i)
            else:continue
        
        return r

法2

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        if array == []:
            return None
        if len(array) == 1:
            return array

        d = {}
        for n in array:
            if n not in d.keys():
                d[n] = 1
            else:
                d[n] = d[n] + 1
        r = []
        for s, n in d.items():
            if n == 1:
                r.append(s)
         
        return r

法3

class Solution:
    def FindNumsAppearOnce(self, array):
        # write code here
        if array == []:
            return None
        if len(array) == 1:
            return array

        array.sort()
        r = []
        for i in range(len(array)):
            if i == 0 and array[i] != array[i+1] or i == len(array)-1 and array[i] != array[i-1]:
                r.append(array[i])
            elif array[i - 1] != array[i] and array[i] != array[i + 1]:
                r.append(array[i])

        return r