- 菜 933(B+)
- 中 621(A-) 、622(C+) 、641(C+)
- 危 862(A+)
个人总结:队列的题普遍综合性,理解题意就需要花费一定时间。队列是先进先出。有几道都是自定义构造类,实现功能。还是比较锻炼代码基础的。逻辑性还是不好,代码构建时有一些心浮气躁。需要沉下心,慢慢努力。
额外扩展:collections模块的Counter类
933. 最近的请求次数(B)
分析:蛤?看题看了三遍,也没读懂要求到底是什么。不是出题人表达能力欠佳,要不就是我理解欠佳。暂且归于后者吧。看了评论知道了题意。如下:
1 | /*法1:其实这题很简单的,用队列的enqueue和dequeue做很简洁(队列用C语言做要啰嗦点)*/ |
1 | class RecentCounter: |
621. 任务调度器(A-)
分析:CPU调度,一开始就被这标题吓唬住了。了解题意后,也没有什么好的想法。看答案,基本都是一个路子。找到一个计算公式。 (count[25] - 1) * (n + 1) + maxCount
公式详解:
- 假设数组 [“A”,”A”,”A”,”B”,”B”,”C”],n = 2,A的频率最高,记为count = 3,所以两个A之间必须间隔2个任务,才能满足题意并且是最短时间(两个A的间隔大于2的总时间必然不是最短),因此执行顺序为: A->X->X->A->X->X->A,这里的X表示除了A以外其他字母,或者是待命,不用关心具体是什么,反正用来填充两个A的间隔的。上面执行顺序的规律是: 有count - 1个A,其中每个A需要搭配n个X,再加上最后一个A,所以总时间为 (count - 1) * (n + 1) + 1
- 要注意可能会出现多个频率相同且都是最高的任务,比如 [“A”,”A”,”A”,”B”,”B”,”B”,”C”,”C”],所以最后会剩下一个A和一个B,因此最后要加上频率最高的不同任务的个数 maxCount
- 公式算出的值可能会比数组的长度小,如[“A”,”A”,”B”,”B”],n = 0,此时要取数组的长度
1 | class Solution: |
扩展:collections模块的Counter类
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
参考:http://www.pythoner.com/205.html
第二种方法,基本上区别不大。
1 | class Solution: |
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
622. 设计循环队列(C)
分析:构建类,设计循环队列。很好理解,也算是第一次见这种题型。构建循环队列可以使用数组或者是链表。
MyCircularQueue(k)
: 构造器,设置队列长度为 k 。Front
: 从队首获取元素。如果队列为空,返回 -1 。Rear
: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value)
: 向循环队列插入一个元素。如果成功插入则返回真。deQueue()
: 从循环队列中删除一个元素。如果成功删除则返回真。isEmpty()
: 检查循环队列是否为空。isFull()
: 检查循环队列是否已满。
循环队列关键点在于avail = (self._front + self._size ) % len(self._data)
第一个数位置变动,如果大于循环数组长度,就可以在队列前面添加元素。其他“%”皆是如此。
1 | class MyCircularQueue(object): |
641. 设计循环双端队列(C)
分析:跟前一题基本类似。加了一个双端要求。题中要求不可以使用内置的双端队列。
1 | class MyCircularDeque: |
第二种。是同622一样的做法。
1 | class MyCircularDeque: |
862. 和至少为 K 的最短子数组(A+)
分析:结合了队列和动态规划。由于题中给了 (1 <= K)所以,必须要保证,dp 后一个值减去前一个值,而且是必须大于0才是有效的。从双端队列左侧出队,来寻求最短的字数组是精华所在。
1 | import collections |