每日一练
2.7
- RSA算法:p=23,q=29,加密指数e=13,对明文 M=123456,计算用RSA加密得到的密文为( )。
A. 151
B. 264
C. 396
D. 418
【答案】C
【解析】n = p × q = 23 × 29 = 667,公钥 (n,e) = (667,13),得到密文 C = Me mod n = 396。
2.8
- 已知RSA算法中,素数p=5,q=7,模数n=35,公开密钥e=5,密文c=10,明文m=( )。
A. 2
B. 3
C. 5
D. 7
【答案】C
【解析】φ(n)=(5-1) × (7-1) = 24,e × d mod φ(n) = 1,5 × d mod 24 = 1,d = 5。明文m=cd mod 35 = 105 mod 35=5
2.9
- 对于RSA算法,设截获e=5,n=35的用户密文C=10,则明文M是( )。
A. 2
B. 3
C. 5
D. 7
【答案】C
【解析】n = 5 × 7 = 35,φ(n) = 4 × 6 = 24,根据 e × d ≡ 1 mod φ(n),又 5 × d mod 24 = 1,得 d = 5。
M = cd mod 35 = 105 mod 35 = 5,明文 M = 5
2.10
- 在RSA算法中,选择两个质数 p=17,q=11,加速密钥为e=7,计算密钥d=( )。
A. 3
B. 11
C. 17
D. 23
【答案】D
【解析】n = p × q = 17 × 11 = 187,φ(n) = (17-1) × (11-1) = 160,根据 e × d ≡ 1 mod φ(n),又 7 × d mod 160 = 1,密钥 d = 23。
2.11
-
在CTF(Capture The Flag)比赛中,常见的一种题型是对RSA加密的信息进行爆破(破解),下列选项中不属于对RSA爆破方式的是( )。
I. Pollard_rho分解
II. 小指数明文爆破
III. LLL-attack
IV. CBC bit翻转攻击
A. I
B. II
C. III
D. IV
【答案】D
【解析】本题的切入口是选项D中的CBC,CBC是分组密码的一种加密模式。据此可知D选项并不属于公钥密码体系内的破解方式。
2.12
- 后序遍历为二叉树遍历方式中的一种,假设将{ 3, 8, 9, 1, 2, 6 }依次插入初始为空的二叉排序树。则该树的后序遍历结果是多少( )?
A. 1, 2, 8, 6, 9, 3
B. 2, 1, 6, 9, 8, 3
C. 1, 2, 3, 6, 9, 8
D. 2, 1, 3, 6, 9, 8
【答案】B
2.13
- JVM将堆分成了两个大区:新生代(Young)和老年代(Old),新生代又被进一步划分为Eden和Survivor区,其中Young区划分为Eden、Survivor1、Survivor2这三块,请问JVM的hotspot虚拟机三块默认分配的比例各是多少?
A. 6:2:2
B. 8:1:1
C. 4:3:3
D. 8:1:2
【答案】B
2.14
- 下列关于链表的说法错误的是( )。
A. 可随机访问任何一个元素
B. 插入、删除操作不需要移动元素
C. 无需事先估计存储空间大小
D. 所需存储空间与线性表长度成正比
【答案】A
【解析】随机访问的含义是随机给定某元素的索引(地址),能够立刻对该元素进行访问。数组可以做到这一点。但是当访问链表的非头结点时,必须通过移动指针,遍历到该结点时才能访问,所以链表是顺序访问的,它不能随机访问任何一个元素。
2.15
-
下列关于线程池的工作原理的叙述中正确的是( )。
① 当线程池中有任务需要执行时,如果线程数量没有超过核心数量就会新建线程进行任务执行
② 当线程池中有任务需要执行时,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行
③ 当线程池中有任务需要执行时,如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务
④ 当线程池中有任务需要执行时,如果任务队列超过最大队列数,并且线程池超过了最大线程数,就会执行拒绝执行策略
A. 仅①、②
B. 仅①、②、③
C. 仅①、③、④
D. 全部正确
【答案】D
【解析】当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了最大线程数,就会执行拒绝执行策略。
2.16
-
表达式 A + (B × C + D) × E 对应的后缀表达式是( )。
① A B C D E + × + ×
② A B + C × D E + ×
③ A B C × D + E × +
④ A B + C × D × E +
A. ①
B. ②
C. ③
D. ④
【答案】C
2.17
- 一棵包含 20 个节点的二叉树最多包含多少个叶子节点()。
A. 9
B. 10
C. 11
D. 19
【答案】B
【解析】一棵包含 20 个节点的二叉树共有 19条边(即 19 对父子关系),要使叶子结点尽可能地多,需要让包含 2 个子节点的节点数尽量大,则 19 条边最多能让 9 个节点包含 2 个子节点,剩余的 1 条边让 1 个节点包含 1 个子节点,所以非叶子节点个数最少为 9 + 1 = 10,叶子节点个数最多为 20 - 10 = 10。
2.18
- 对于一棵包含 n 个节点的大根堆来说,插入一个元素、查询最大值、删除最大值这三种操作的时间复杂度分别为( )。
A. O(n),O(1),O(log n)
B. O(log n),O(1),O(log n)
C. O(log n),O(1),O(1)
D. O(log n),O(1),O(n)
【答案】B
【解析】对于一个包含 n 个元素的大根堆来说,因为堆顶元素就是其最大值,所以查询最大值的时间复杂度为 O(1);插入一个元素或删除最大值(即删除堆顶元素)的时间复杂度为 O(log n)。
2.19
- 下列关于Spring中BeanFactory与ApplicationContext的比较,说法错误的是?
A. ApplicationContext在BeanFactory的基础上添加了Spring事件处理机制
B. ApplicationContext在BeanFactory的基础上添加了国际化功能
C. 多个ApplicationContext之间可以具有父子关系,多个BeanFactory之间也可以具有父子关系
D. ApplicationContext中对于Bean的依赖注入(即对于getBean()方法的调用)是委托给BeanFactory来实现的
【答案】C
2.20
-
小牛刚刚学习算法,想用动态规划来实现爬楼梯问题:n 阶楼梯每次可以爬1或2个台阶,让你实现如下代码,来判断总共有多少种方法呢:
int climbStairs(int n) { vector<int>dp(n+3,0); dp[1] = 1; dp[2] = 2; for(int i = 3; i<=n; i++){ _____________________ } return dp[n]; }
A. dp[i]=dp[i]+dp[i-2];
B. dp[i]=dp[i-1]+dp[i-2];
C. dp[i]=max(dp[i],dp[i-1]);
D. dp[i]=max(dp[i-1],dp[i-2]);
【答案】B
2.21
-
下列关于并查集的说法错误的是( )。
① 并查集可用于确定某个元素处于哪个子集;
② 并查集可用于将两个子集合并成一个集合;
③ 并查集的优化方法有路径压缩和按秩合并
④ 并查集的查找与合并的时间复杂度均可优化至O(1)
A. ①
B. ②
C. ③
D. ④
【答案】D
【解析】并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题。查找(Find):确定某个元素处于哪个子集;合并(Union):将两个子集合并成一个集合。并查集的优化方法有路径压缩和按秩合并(启发式合并)。并查集的合并与查找的均摊时间复杂度为 O(α(n))。
2.22
- 下列排序算法中,平均时间复杂度最低的排序算法是( )。
A. 冒泡排序
B. 选择排序
C. 快速排序
D. 插入排序
【答案】C
【解析】冒泡排序、选择排序、插入排序的平均时间复杂度均为O(n2);快速排序的平均时间复杂度为O(n log n)。
2.23
-
下列关于快速排序和归并排序的叙述中错误的是( )。
① 快速排序和选择排序都基于分治的思想;
② 归并排序的空间开销比快速排序大一倍;
③ 归并排序的时间开销比快速排序大一倍;
④ 快速排序是“自顶向下”的,归并排序是“自底向上”的。
A. ①
B. ②
C. ③
D. ④
【答案】C
【解析】快速排序和归并排序都是基于“分治”思想,其中快速排序在每一步是确定一个元素,并将小于它的元素和大于它的元素划分成两部分,再递归地对两部分进行排序,是“自顶向下”的;而归并排序是先将当前段落分成两部分,先向下将两部分分别排好序,再在当前这一层将排好序的两部分合并成一个整体,是“自底向上”的。由于归并排序需要额外开一个空间储存临时值,而快速排序不需要额外开空间,所以归并排序的空间开销会比快速排序大一倍。快速排序在一般情况下运行速度比较快,但是某些情况下未经优化的快速排序算法的时间复杂度会降到O(n2),所以选项 ③ 的描述是错误的。
2.24
- 使用二分查找在一个包含 1000 个节点的有序线性表中查找某个元素是否存在,最多需要比较( )次。
A. 9
B. 10
C. 11
D. 12
【答案】B
【解析】使用二分查找在一个包含 n 个节点的有序线性表中查找某个元素是否存在的最多比较次数是 ⌈ log2 n ⌉,本题中 n = 1000,⌈ log2 1000 ⌉ = 10。
2.25
- 以下排序算法中,不是基于比较的排序算法是( )。
A. 冒泡排序
B. 快速排序
C. 归并排序
D. 计数排序
【答案】D
【解析】计数排序不是基于比较的排序算法。
2.26
- 运用下列哪个命令能够获取JVM的内存映像
A. jinfo
B. jmap
C. jhat
D. jstat
【答案】B
【解析】
2.27
- 下列Java代码中的变量a、b、c分别在内存的____存储区存放。
class A {
private String a = "aa";
public boolean methodB() {
String b = "bb";
final String c = "cc";
}
}
A. 堆区、堆区、堆区
B. 堆区、栈区、堆区
C. 堆区、栈区、栈区
D. 堆区、堆区、栈区
【答案】C
2.28
- 有一个包含 15 个元素的有序线性表如下,若使用二分查找在线性表中查找元素 55 是否存在,需要比较( )次。
1,5,8,9,13,17,25,33,36,42,53,55,66,78,91
A. 1
B. 2
C. 3
D. 4
【答案】B
【解析】二分查找每次比较的是中间的元素,初始时区间范围是 [1,15],所以第一次是取第 (1+15)/2=8 个数(即 33)和 55 比较,发现 33 < 55;所以区间范围缩减为 [9,15],第二次取第 (9+15)/2 = 12 个数(即 55)和 55 比,发现恰好相等,所以总共比较了 2 次就查找到了 55。