一、单选题(每题2分,共30分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | D | B | A | D | D | A | A | C | D | B | C | A | B | B | C |
1、下列C++代码的输出结果是( )。
A. 0
B. 1
C. 0.5
D. 0.7071
【答案】:B
【解析】:计算机中的三角函数使用的是弧度,3.1415926可以看作Π,也就是求sin(Π/2)=1.
2、对于如下图的⼆叉树 ,说法正确的是( )。
A.先序遍历是 132 。
B.中序遍历是 123 。
C.后序遍历是312。
D.先序遍历和后序遍历正好是相反的。
【答案】:D
【解析】:先序遍历为123,中序遍历为132,后序遍历为321,答案选D
3、已知两个序列s1= {1,3,4,5,6,7,7,8,1} 、s2= {3,5,7,4,8,2,9,5,1} ,则它们的最长公共⼦序列是 ( ) 。
A. {3,5,7,8,1}
B. {3,4,5,7,8}
C. {5,7,8}
D. {3,5,7,9,1}
【答案】:A
【解析】:最长公共子序列指最长的序列满足即是s1的子序列又是s2的子序列,选项A满足要求且是最长的
4、关于序列{2,7,1,5,6,4,3,8,9}, 以下说法错误的是( )。
A. {2,5,6,8,9} 是它的最长上升⼦序列
B. {1,5,6,8,9} 是它的最长上升⼦序列
C. {7,5,4,3} 是它的最长下降⼦序列
D. {1,5,6,8,9} 是它的唯⼀最长上升⼦序列
【答案】:D
【解析】:{2,5,6,8,9}也是它的最长上升子序列,并不唯一
5、关于图的深度优先搜索和⼴度优先搜索,下列说法错误的是( )。
A.⼆叉树是也是⼀种图。
B.⼆叉树的前序遍历和后序遍历都是深度优先搜索的⼀种。
C.深度优先搜索可以从任意根节点开始。
D.⼆叉树的后序遍历也是⼴度优先搜索的⼀种。
【答案】:D
【解析】:广度优先搜索往往使用队列按照节点的深度有序的方式依次遍历,很容易发现,后序遍历中节点的深度并不有序。
6、对于如下⼆叉树 ,下⾯访问顺序说法错误的是( )。
A. HDEBFIGCA不是它的后序遍历序列
B. ABCDEFGHI是它的⼴度优先遍历序列
C. ABDHECFGI是它的深度优先遍历序列
D. ABDHECFGI是它的先序遍历序列
【答案】:A
【解析】:后序遍历可以记作左右根,上图的后序遍历为HDEBFIGCA,选项A错误
7、以下哪个方案不能合理解决或缓解哈希表冲突( )。
A.丢弃发生冲突的新元素。
B.在每个哈希表项处 ,使用不同的哈希函数再建立⼀个哈希表 ,管理该表项的冲突元素。
C.在每个哈希表项处 ,建立二叉排序树 ,管理该表项的冲突元素。
D.使用不同的哈希函数建⽴额外的哈希表 ,⽤来管理所有发生冲突的元素。
【答案】:A
【解析】:不能丢弃发生冲突的新元素
8、在C++中 ,关于运算符&,下⾯说法正确的是( )。
A. 2 & 3 的结果是true
B. 011 & 111 的结果是3
C. 3 & 6 的结果是2
D. 110 & 101 的结果是4
【答案】:C
【解析】:运算符&是按位与,结果类型为整类型,A错误。,数字3的二进制为11,6的二进制为110,所以3&6=。注意B和D选项中,011为八进制的9,而111、110、101则均为十进制。
9、下⾯关于图的说法正确的是( )。
A.在无向图中 ,环是指⾄少包含三个不同顶点 ,并且第⼀个顶点和最后⼀个顶点是相同的路径。
B.在有向图中 ,环是指⼀个顶点经过⾄少另⼀个顶点到⾃⾝的路径。
C.在有向图中 ,如果任意两个顶点之间都存在⼀条边 ,则这个图⼀定是强连通图。
D.在有向图中 ,所有顶点的⼊度和出度的总和就是图的边数的两倍。
【答案】:D
【解析】:每条有向边都会贡献一个入度和一个出度,所以所有顶点的⼊度和出度的总和就是图的边数的两倍,选项D正确。
10、图的存储和遍历算法 ,下⾯说法错误的是( )。
A.图的深度优先搜索和⼴度优先搜索对有向图和⽆向图都适⽤ 。
B.图的深度优先搜索和⼆叉树的先序遍历道理是不⼀样的。
C.图的深度优先搜索需要借助栈来完成。
D.邻接表中 ,顶点vi对应链表中的边结点数⽬正好是顶点vi的度。
【答案】:B
【解析】:图的深度优先搜索和⼆叉树的先序遍历都基于深度优先的原理。
11、如下图所⽰的邻接表结构 ,表⽰的是下列哪个选项中的图?
【答案】:C
【解析】:注意到存边方式是邻接表,0号点(V1)连向的是3号点(V4)和1号点(V2),1号点连向的是4,2,0号点,2号点连向的是4,3,1号点,依次类推,可以选出正确选项C。
12、如下图所示的邻接矩阵(inf表示无穷大) ,表⽰的是下列哪个选项中的图?
【答案】:A
【解析】:注意到存边方式是邻接矩阵,0连向2,3,距离分别是12和30,1不连向任何人,2连向4,距离是32,依次类推,可以选出正确答案A。
-
下⾯程序的输出为( )。
A. 5
B. 8
C. 13
D.⽆法正常结束。
【答案】:B
【解析】:容易发现这是斐波那契数列,可以使用递推的方式,算出斐波那契数列的前6项分别是1,1,2,3,5,8,答案为B。
14、下⾯count_triple函数的时间复杂度为( )。
A. O(n)
B. O(n2)
C. O(n3)
D. O(n4)
【答案】:B
【解析】:两层for循环,每层for循环的上界均为n,总时间复杂度为O(n2)
15、下列选项中 ,哪个可能是下图的深度优先遍历序列( )。
A. 1, 3, 7, 5, 4, 2, 6, 8, 9
B. 9, 4, 2, 1, 3, 5, 7, 6, 8
C. 1, 3, 4, 2, 7, 6, 8, 9, 5
D. 9, 7, 6, 8, 4, 2, 1, 5, 3
【答案】:C
【解析】:深度优先遍历需要按照能走就走的原则进行遍历,A选项5后面应该是6,B选项3后面应该是7,D选项8后面应该是5
二、判断题 (每题 2 分,共 20 分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | × | √ | × | √ | × | × | × | √ | √ | √ |
1、C++语⾔中 ,表达式 6 & 5 的结果类型为int、值为1。
【答案】:错
【解析】:6的二进制位110,5二进制为101,6&5=4
2、冒泡排序是稳定的排序算法。
【答案】:对
【解析】:稳定的排序算法指值相同的元素在排序前后的相对顺序不变,冒泡排序是稳定的排序算法
3、唯⼀分解定理(算术基本定理)指出 ,每个⼤于1的⾃然数都可以唯⼀地分解成若⼲个素数的乘积 。 因此, 我们可以很容易的对给定的⾃然数 n进⾏质因数分解 ,时间复杂度仅为o(log(n))。
【答案】:错
【解析】:对n进行质因数分解的时间复杂度为O(sqrt(n)
4、C++语⾔中 ,可以为同⼀个类定义多个构造函数。
【答案】:对
【解析】:C++会根据参数的不同选择正确的构造函数。
5、使⽤math.h或cmath头⽂件中的对数函数 ,表达式 log(128)的结果类型为double 、值约为7.0。
【答案】:错
【解析】:log默认是以e为底。
6、⼀颗N层的⼆叉树 ,⾄少有2N 1个节点。
【答案】:错
【解析】:N层的二叉树,最少的节点数量为N。
7、⾮连通图不能使⽤⼴度优先搜索算法进⾏遍历。
【答案】:错
【解析】:非连通图需要进行多次广度优先搜索算法。
8、现使⽤有N个表项的哈希表 ,从 M个元素中进⾏查找 。该哈希表为解决哈希函数冲突 ,为每个表项处建⽴单 链表存储冲突元素 。其查找操作的最坏情况时间复杂度为O(M)。
【答案】:对
【解析】:如果M个元素全部冲突,则需要去单链表进行查询,时间复杂度为O(M).
9、动态规划有递推实现和递归实现 ,对于很多问题 ,通过记录⼦问题的解 ,两种实现的时间复杂度是相同的。
【答案】:对
【解析】:使用递归算法并记录子问题的解就是动态规划中的记忆化搜索,和递推算法实现动态规划的时间复杂度一致
10、泛洪算法的递归⽅法容易造成溢出, 因此⼤的⼆维地图算法中 ,⼀般不⽤递归⽅法。
【答案】:对
【解析】:C++中栈空间一般比较小,递归层数过大容易造成栈溢出。
三、编程题(每题25分,共50分)
题号 | 1 | 2 |
答案 |
1、黑白翻转
题面描述
⼩杨有⼀棵包含n个节点的树 ,这棵树上的任意⼀个节点要么是⽩⾊ ,要么是⿊⾊ 。⼩杨认为⼀棵树是美丽树当且 仅当在删除所有⽩⾊节点之后 ,剩余节点仍然组成⼀棵树。
⼩杨每次操作可以选择⼀个⽩⾊节点将它的颜⾊变为⿊⾊ ,他想知道⾃⼰最少要执⾏多少次操作可以使得这棵树变 为美丽树。
输入格式
第⼀⾏包含⼀个正整数n,代表树的节点数。
第⼆⾏包含n个⾮负整数a1, a2, · · · , an,其中如果ai= 0 ,则节点i的颜⾊为⽩⾊ ,否则为⿊⾊ 。 之后 n - 1 行 ,每行包含两个正整数 xi, yi,代表存在⼀条连接节点xi和yi的边。
输出格式
输出⼀个整数 ,代表最少执⾏的操作次数。
样例1
样例解释
将节点1和3变为⿊⾊即可使这棵树变为美丽树 ,此时删除⽩⾊节点 5,剩余⿊⾊节点仍然组成⼀棵树。
数据范围
对于全部数据 ,保证有 1≤ n ≤105,0≤ ai≤1 。
【题目大意】
给定一棵树,节点的颜色为白色或黑色,要求将尽量少的白点染为黑点,满足去掉所有的白点后,剩余的黑点依然构成一棵树(n≤105)
【解题思路】
我们考虑一个树的哪些节点删除后,依然为一棵树。显然是所有叶子节点。在把所有叶子节点删去后,新的树的叶子节点依然可以继续删除。以此类推。也就是说,对于一个白点u,如果以u为根的子树中不存在黑点的话,那么这个白点就可以被删除,否则该白点需要被染为黑点,只需要一遍深度优先搜索,最终答案为n-黑色节点数量-以u为根的子树中不存在黑点的节点数量。还有一个特殊情况,即根节点也可能可以删除,解决方法是钦定一个黑色节点为根。
参考程序
2、区间乘积
题面描述
⼩杨有⼀个包含n个正整数的序列A = [a1, a2, - , an]。
⼩杨想知道有多少对< l, r > ( 1 ≤l ≤r ≤n) 满⾜ai×ai+1×…×ar为完全平⽅数。 ⼀个正整数 x为完全平⽅数当且仅当存在⼀个正整数y使得x =y ×y。
输入格式
第一行包含一个正整数n,代表正整数个数。
第二行包含几个正整数a1,a2, .. ,an,代表序列A。
输出格式
输出一个整数,代表满足要求的<l,r > 数量。
样例1
样例解释
满⾜条件的< l, r > 有< 3, 3 > 和< 1 , 5 > 。
数据范围
对于全部数据 ,保证有 1≤n ≤105,1≤ai≤30。
【题目大意】
给定n个数的序列a,求有多少组[l,r]满足(),且a[l]*a[l+1]*a[l+2]*…*a[r]是完全平方数(n ≤ 105, a[i] ≤ 30)
【解题思路】
一段区间积的真实值很显然我们无法求出来,那么就要通过完全平方数的性质进行转化。我们有结论:一个数是完全平方数,当且仅当这个数质因数分解后,所有质因子的指数都为偶数。那么,判定一个数是否为完全平方数,可以等价于判定它的所有素因子的指数是否为偶数。注意到a[i]<=30,那么a[i]中质因子的个数只有2,3,5,7,11,13,17,19,23,29共10个,可以用十位的二进制数进行表示,若a[i]中含有奇数个第x个质因子,则让二进制表示的第x位为1,否则为0。设这个十位二进制数为b[i],则问题转变为找到[l,r]满足b[l]^b[l+1]^b[l+2]^…^b[r]=0,区间的xor和是满足做差的性质的,进一步转化为sum[r]^sum[l-1]=0(sum数组为b数组的xor前缀和),也就是找l和r,满足sum[r]=sum[l-1],这一步可以先统计出sum[i](0<=i<=n)等于某一定值k的数量cnt,根据乘法原理,最终答案为cnt*(cnt-1)/2,而k的取值范围为[0~],可以使用类似桶排的方式统计。
参考程序