牛客网-找缺失数字-关于python集合的理解
关于本项目的说明
本人测试小白,为了强化有关代码方面的能力,如今每天做好一个算法题,并探讨明了题目中使用到的相关python语法,数据结构等。在此项目中做一个简单的讲解与记录。
牛客网题目
从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,找出这n个数中缺失的那个数,要求O(n)尽可能小。
牛客网最快解题代码
class Solution:
def solve(self , a ):
# write code here
for i in range(1, len(a)):
if a[i] - a[i - 1] == 2:
return a[i] - 1
return 0;
使用集合的解题思路
class Solution:
def solve(self , a ):
b=list(range(a[-1]+1))
#生成list
seta=set(a)
setb=set(b)
#把list转化为集合
setc=setb^seta
#比较集合中不同的元素
return list(setc)[0]
#由于集合无法遍历或取出元素,仅仅计算效率较高,所以最后返回的结果还需转化为list再取出
关于python集合的说明
python中的集合是和元组(tuple)、列表(list)相同级别的基础数据类型,但元组和列表均是可序列化的数据类型,而集合是一种不可有重复元素的无序且不可遍历的数据类型,因此,仅仅可以在运算时具有很强优势,但不可以遍历以及序列化。
初始化集合
初始化集合仅仅可以使用如下方法
emptySet = set()
初始化一个带函值的集合可以传入一个list
dataScientist = set(['Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'])
dataEngineer = set(['Python', 'Java', 'Scala', 'Git', 'SQL', 'Hadoop'])
集合元素的添加与删除
集合元素的添加
添加集合元素如下所示
graphicDesigner.add('Illustrator')
注意,向集合中添加的元素仅仅可以是字符串或元组,这样不可变的元素,而list是可以变的元素,向集合中添加会导致程序返回type error
集合元素的删除
删除集合元素共有四种方法,remove,discard,pop,clear
其中remove可以删除指定元素,如果被删除元素不存在则返回key error
graphicDesigner.remove('Illustrator')
discard与remove方法类似,但如果删除不存在元素不会报错
graphicDesigner.discard('Illustrator')
pop方法删除集合中任意一个值,但如果集合是空的则返回key error
clear方法可以删除集合中所有的值
集合的“序列化”
不知道“序列化”一词使用的是否准确,但如果我们吧集合变为一个有序列表则可以使用如下方法
type(sorted(dataScientist))
四种集合运算方法
下面我们来说明一下我们常用的四种集合运算方法
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
关于前文两种算法的总结
如果使用for循环遍历,那么将会把较为短小的list找寻结果变快,或使用二分法,可以进一步减小内存,加快速度,但使用集合方法,可以快速比对数据,在较大list的寻值中快速找到相关数据,并且通用性更强。