考试算法题,上机编程考试准备思路

主要讲一下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)

一个题目帮你搞定哈希表 - 知乎 (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插件自己检查一下,自行搜索吧,下不了就自己多看看大佬的代码,把题的时间和空间复杂度降下来了大方向上不会扣很多。

  • 32
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值