主要讲一下Python的,题库方面C++\python\java差不多的,只是数据结构方面有区别,备战的思路都差不多,C语言的不太一样。
一、题型
1.1 题型
有简单、中等和困难三种,第三题有时也会出设计题,实现一个类和接口,完成特定功能。3小时。百分制通过线65分。字符串或者数组题,熟练掌握数据结构之后问题不大。
观察题目数据量估算时间复杂度,选择合适的算法避免超时,超时只能看测试用例通过数,一些比较难的题实在不会做暴力递归一下,基本一半的分是有的,实在太离谱的当我没说。
1.2 时间
以C++为例,当N=10^9时,运行时间为1.375s,以此为基准估算时间。
题目时间限制通常是1000ms。
若N数量级~= 10^4,采用O(N^2)算法。
若N数量级~= 10^4~10^7,采用O(N*logN)算法(应用二分法以及优先队列等)。
若N数量级~= 10^7~10^9,采用O(N)或者O(logN)算法。
1.3 代码简洁度
!!!
某编程题目得分 = 用例通过率 * 该编程题目分值 - 代码简洁度扣分
重点!测试用例通过率自己可以看到是否全部通过,但会减去代码简洁度的得分。
设计题目时请注意代码规范的设计规则,例如一些题目看上去简单,使用多个if分支判断就能完成,但是明显圈复杂度超过最大值那这道题就没分。
代码规范扣分含编程规范、圈复杂度、代码嵌套深度、单函数代码行数等违反扣分
1) 代码规范扣分细则:
a) 编程规范要求项:违反1处扣1分。
b) 最大圈复杂度: (10,15]扣3分,(15,20]扣5分。
c) 最大单函数代码行数:超过100行扣5分。
2) 某道题的最终计分规则:
a) 存在下面情况之一,该道题得分为0
l 按上述“1) CleanCode扣分细则”扣分之和超过该道题的题目分值。
l 最大圈复杂度大于20。
l 最大代码嵌套深度大于等于8。
l 存在恶意绕过规则的行为,例如无程序逻辑直接返回某值。
b) 其他情况,该题的规范扣分不超过该题目分值的20%。
1.4 安全函数
leetcode上能用的应该都能用,自己去搜搜吧,懒得写了。
这个可以引用的库得背一背,没有IDE给你提示的,很多题用第三方库会简单很多。
二、考试要点和范围
在刷题之前最好先把要求中允许引用的包过一遍,很多题使用了相应的数据结构就会简单得多
以python为例:
1.bisect:有序序列的插入和查找
import bisect
i = bisect.bisect_left(arr, x) # 查找目标元素左侧插入点
j = bisect.bisect(arr, x) # 查找目标元素右侧插入点
bisect.insort_left(arr, x) # 查找目标元素左侧插入点,并保序地 插入 元素
bisect.insort(arr, x) # 查找目标元素右侧插入点,并保序地插入元素
2.deque:双链表
from collections import deque # 插入、删除双向链表
q = deque([1, 2, 3])
q.append(4)
q.appendleft(5)
3.defaultdict:这个使用得很多,基本在使用python原生字典时都可以替换使用defaultdict
from collections import defaultdict
dict = defaultdict(lambda: []) # key不存在返回默认值
4.OrderedDict
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) # key按照插入顺序排列
5.Counter:计数器
from collections import Counter
c = Counter('abcdab')
d = Counter('a')
6.copy:拷贝
import copy
b = copy.copy(a) # 浅拷贝
m = copy.deepcopy(a) # 深拷贝
7.heapq:heapq实现了一个适合与Python的列表一起使用的最小堆排序算法
import heapq # 小顶堆
heapq.heapify(x) # 列表转化为堆
heapq.heappush(x, 1) # 加入值
heapq.heappop(x) # 弹出最小元素
8.math:运算模块用的多(ceil,floor)
9.re:正则,关于正则最好还是详细过一遍,别想到了使用正则但是忘了表达式怎么写
【Python】系列模块之标准库re详解_python re-CSDN博客
常用的就是上面这些,python其他的比如题目中出现了二叉树,但输入的时候还是列表,按列表来做就可以了。
C++中数据结构直接导包,所以C++要难一点,要比较熟悉数据结构才行。
比如哈希表
来吧!一文彻底搞定哈希表! - 知乎 (zhihu.com)
c++ unordered_map 哈希表使用 - 卷积 - 博客园 (cnblogs.com)
其他的自己搜一搜吧
三、知识总结
参考这篇代码随想录链接
四、刷题思路
刷题最好先从一定的路线刷起,对某类型的题总结出一定的思路,在遇到相似的题时就能比较快做出来了(不考动态规划,关于动态规划这部分不用看)
1.贪心:贪心算法并没有固定的套路,说白了就是常识性推导加上举反例。所以唯一的难点就是如何通过局部最优,推出整体最优。如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。
分发糖果
根据身高重建队列
用最少数量的箭引爆气球
这类型的题leetcode上很多,主要是理解贪心的思路,一道设计贪心算法的题基本还会混合其他的知识,所以没有固定的思路,主要还是逻辑上的推导。
2.”连续子集”:基本上双指针或者滑动窗口没跑了,需要注意的就是快慢指针和边界的问题。
3.排列组合:类似箱子放球问题,数学上的C和A,使用递归和回溯,其实逻辑相对复杂一点,这个做多了可以总结一个自己的范式。
组合问题
组合总和III
组合总和(注意一下排列组合中重复选择的问题,改动的地方仅仅从i+1改为了i,但逻辑上已经变为了可以重复选取了)
组合总和II(去重策略,引入遍历矩阵)
4.DFS\BFS:必看,不过这个一般都出现在第三题,而且涉及到剪枝。
5.字符串、链表、二叉树:主要是熟悉数据结构和对于库中的方法。
6.栈和队列:可以略过,想到了就使用collections中的堆栈,没想到使用基础数组+逻辑实现也可以。
五、例题
六、代码规范
IDE下一个cc插件自己检查一下,自行搜索吧,下不了就自己多看看大佬的代码,把题的时间和空间复杂度降下来了大方向上不会扣很多。