[review]leetcode 448 Find all numbers disappeared in array

原题是:

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

思路1:

是把输入数组排序,遍历输入数组,如果这个数和前一个不一样,就去[1,2,,...n]数组总删除这个数。
方法可行,但是因为要排序,所以超时。

思路2:

利用Python list与set的互相转换

代码是:

class Solution(object):
    def findDisappearedNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        
        x = list(range(1,len(nums)+1))
        
        return list(set(x).difference(set(nums)))

别人的代码:
将输入数组中出现的数,去[1....n]数组中删掉,删掉的数用0占位,以保证序号。
删完后,把所有的0去掉,剩下的就是输入数组所缺的数。


Screen Shot 2017-10-06 at 11.18.56 AM.png

学到的知识点:

1.python 中list 与set的互相转换

在python中,数组可以用list来表示。如果有两个数组,分别要求交集,并集与差集,怎么实现比较方便呢?

def diff(listA,listB):
    #求交集的两种方式
    retA = [i for i in listA if i in listB]
    retB = list(set(listA).intersection(set(listB)))

    print "retA is: ",retA
    print "retB is: ",retB

    #求并集
    retC = list(set(listA).union(set(listB)))
    print "retC1 is: ",retC

    #求差集,在B中但不在A中
    retD = list(set(listB).difference(set(listA)))
    print "retD is: ",retD

    retE = [i for i in listB if i not in listA]
    print "retE is: ",retE

def main():
    listA = [1,2,3,4,5]
    listB = [3,4,5,6,7]
    diff(listA,listB)

if __name__ == '__main__':
    main()

运行结果是:
retA is: [3, 4, 5]
retB is: [3, 4, 5]
retC1 is: [1, 2, 3, 4, 5, 6, 7]
retD is: [6, 7]
retE is: [6, 7]

结合代码来看,大体上是两种思路:
1.使用列表解析式。列表解析式一般来说比循环更快,而且更pythonic显得更牛逼。
2.将list转成set以后,使用set的各种方法去处理。

2.去掉list里的重复元素

Screen Shot 2017-10-06 at 10.26.44 AM.png

二维的list不能转换为set


Screen Shot 2017-10-06 at 10.27.03 AM.png

3.list列表增删改查合并排序

# Auther: Aaron Fan

names = ["aaron", "alex", "james", "meihengfan"]
names2 = [1,2,3,4,5]
print(names)

#查
#print(names)            #列出列表的内容
print(names[3])         #访问列表中第4个值
print(names[1:3])       #访问列表中从第2个到第3个的值
print(names[-1])        #访问列表中的最后一个值
print(names[:-2])       #访问列表中的所有值,但是把倒数第二个及后面的所有值都去掉
print(names[-3:])       #访问列表中倒数第一个到倒数第三个的值
print(names[0],names[3])    #注意取多个值的时候,不能直接把下标写到一起,需要按照这种方式写
print(names[::2])       #打印列表,但是以2为步长,就是跳着切,也可以根据需求把这个步长给改了

print(names.index("james"))         #查找列表中james这个元素的下标
print(len(names))                   #确定列表的长度


#增
names.append("jack")                                #在列表末尾插入一个元素
names.insert(1,"fanheng")                           #把fanheng插入到第二个位置那里

#改
names[2] = "liming"                                 #把第三个位置的元素改成liming

#删
names.remove("liming")                              #把元素liming从列表中删除
del names[2]                                        #把第三个元素删除,必须知道元素的索引
#del names                              #直接删除列表
names.pop()           #默认删除列表末尾的元素,当然也可以直接指定元素的下标去弹出一个指定的元素,并让你等够接着使用它
#每当你使用pop时,被弹出的元素就不再在列表中了。
#pop把一个元素从列表中弹出来了,被弹出来的值,可以直接赋给其它变量使用,比如:
popend_name = names.pop()
print(popend_name)
#names.clear()           #清空列表,危险操作,请慎用

#其它操作
#names.reverse()                     #把列表反转,就是把原有顺序完全反过来了

#排序
#names.sort()                        #把列表永久性的排序
print(sorted(names))                #对列表进行临时性的排序

#合并列表
names.extend(names2)                #把names2的东西合并到names里面
print(names)
Screen Shot 2017-10-06 at 10.52.10 AM.png

4.切片操作

对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

对应上面的问题,取前3个元素,用一行代码就可以完成切片:

L[0:3]
['Michael', 'Sarah', 'Tracy']

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
如果第一个索引是0,还可以省略:

L[:3]

['Michael', 'Sarah', 'Tracy']

也可以从索引1开始,取出2个元素出来:

L[1:3]
['Sarah', 'Tracy']

类似的,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,试试:

L[-2:]
['Bob', 'Jack']
L[-2:-1]
['Bob']

记住倒数第一个元素的索引是-1。
切片操作十分有用。我们先创建一个0-99的数列:

L = range(100)
L
[0, 1, 2, 3, ..., 99]

可以通过切片轻松取出某一段数列。比如前10个数:

L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

后10个数:

L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

前11-20个数:

L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

前10个数,每两个取一个:

L[:10:2]
[0, 2, 4, 6, 8]

所有数,每5个取一个:

L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

甚至什么都不写,只写[:]就可以原样复制一个list:

L[:]
[0, 1, 2, 3, ..., 99]

tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:

(0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)

字符串'xxx'或Unicode字符串u'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

'ABCDEFG'[:3]
'ABC'
'ABCDEFG'[::2]
'ACEG'

在很多编程语言中,针对字符串提供了很多各种截取函数,其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 最近在写个性化推荐的论文,经常用到Python来处理数据,被pandas和numpy中的数据选取和索引问题绕的比较...
    shuhanrainbow阅读 4,532评论 6 19
  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 1,889评论 0 3
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,220评论 0 5
  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 2,563评论 1 13
  • 凌晨的风阵阵寒意 吹走了所有倦怠 大脑在此刻异常活跃 那些安慰自己的 麻痹自己的 乃至欺骗自己的 都慢慢崩溃瓦解 ...
    蕾蕾向阳阅读 367评论 3 0