剑指offer40-数组中只出现一次的数字

题目描述

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

知识点回顾

位运算、哈希

代码

解法一:暴力解题,双重循环,O(N^2)

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        a=[]
        for i in range(len(array)):
            flag=1
            for j in range(len(array)):
                if j!=i and array[j]==array[i]:
                    flag=0
            if flag:
                a.append(array[i])
        return a

 解法二:利用字典保存元素出现次数,最后选出字典中value为1的key返回,O(2N)

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        a={}
        for i in range(len(array)):
            try:
                a[array[i]]+=1
            except:
                a[array[i]]=1
        b=[]
        for i in a:
            if a[i]==1:
                b.append(i)
        return b

解法二改进:由于一个整型数组里除了两个数字之外,其他的数字都出现了两次。当字典中有某个key时,删除这个key,否则这个key的value为1插入字典,时间复杂度为O(N)

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        a={}
        for i in range(len(array)):
            try:
                a.pop(array[i])
            except:
                a[array[i]]=1
        return a.keys()

解法三:位运算(略)

原文地址:https://www.cnblogs.com/foolangirl/p/14086730.html