题目答案
A
题目解析
从题中右图 A_0A0出发深度优先遍历,有 44 种可能的路径 (A0, A1, A3, A2)(A0, A3, A1, A2)(A0, A2, A1, A3)(A0, A2, A3, A1)(A0,A1,A3,A2)(A0,A3,A1,A2)(A0,A2,A1,A3)(A0,A2,A3,A1)。因此选项 (A0, A1, A2, A3)(A0,A1,A2,A3) 不是不可能的。
题目答案
C
题目解析
欧几里得算法用来计算 a 和 b 的最大公约数。
题目答案
0,1, 1, 1。
题目解析
由题意可以列出以下方程组:
( s1+s2 ) mod2=1
( s3+s4 ) mod2=0
( s2+s3 ) mod2=0
( s1+s2+s3 ) mod2=0
( s1 ) mod2=0
解得 s1 = 0, s2 = 1, s3 = 1, s4 = 1。由此可见,这个系统并不安全,多次问答的过程会导致密码泄露。事实上,只要该系统要求用户以 p(0<p<0.5)的概率故意答错,就能有效地避免窃听。可以证明,此时即使所有通信被泄露,破解密码也是非常难的。
题目答案
填空位置 ①:
n - p + i
填空位置 ②:
a[i]
填空位置 ③:
n
填空位置 ④:
i - p + 1
填空位置 ⑤:
a[i - p]
题目解析
本题一共给出了 2 种算法:
第一种是开一个临时数组,将后 n−p 个数和前 p个数依次拷贝到临时数组中,再把临时数组复制给当前数组。这一朴素的算法时间和空间复杂度均为O(n)。
第二种是每次把整个数组往左移一位(最左边的移到最后),这样左移 p 次即是最终的数组。省去了 O(n)的临时空间,但是时间复杂度上升至O(n2)。
事实上还存在第三种算法,在时间和空间上结合了前两个算法的优点,具体做法是:取 p 和 n - p 之间的较小值,设为 q,对调前 q 个和后 q 个元素,然后递归处理剩下长度为 n -2q的子序列。具体代码实现读者可以参看提高组试题和解答。
题目答案
填空位置 ①:
cur < upper_bound
填空位置 ②:
a[root].right_child
填空位置 ③:
cur
填空位置 ④:
upper_bound
填空位置 ⑤:
1
题目解析
题目要求检查输入的二叉树是否为二叉查找树,试题中使用了一个较为巧妙的函数is_bst
来判断:
a)当前子树是否为二叉查找树
b)当前子树所有的值是否在区间 [lower_bound,upper_bound]内。
初始时,我们从根节点出发,并将 lower_bound,upper_bound 分别设为无穷小、无穷大。我们去检验当前该点值是否符合传递下来的范围,也就是是否在区间 [lower\_bound, upper\_bound]内。然后,检验左子树是否是二叉查找树,右子树是否是二叉查找树,如果 22 个子树都是二叉查找树,同时当前点的值也在范围内,说明以当前点为根的树也是二叉查找树。
剩下的问题就是如何检验子树是否是二叉查找树,这个问题利用递归就可以来解决,直接调用is_bst
,同时传递子树以及更新边界的值,即[lower_bound,upper_bound],如果是左子树则将 upper\_bound修改为 cur,如果是右子树则将 lower\_bound修改为 cur。直到发现root == 0
也就是当前点为空,证明递归到终点。
题目答案
A
题目解析
方法:按权值展开
思路:分步解决整数部分和小数部分
题目答案
A
题目解析
i = 1;
do {
sum += i;
i++;
} while (i <= 100);
可以正确的计算 1,2,3,…,100之和。
i = 1;
do {
sum += i;
i++;
} while (i > 100);
i = 1;
while (i >= 100) {
sum += i;
i++;
}
循环执行条件是 i>100,在 i 初始等于 1 的情况下,循环不会被执行。
i = 1;
while (i < 100) {
sum += i;
i++;
}
则只能求 1 至 99的和。