已知小写字母 b 的 ASCII 码为 ,下列 C++ 代码的输出结果是( )。
01#include <iostream> 02using namespace std; 03int main() { 04 char a = 'b'; 05 a++; 06 cout << a; 07 return 0; 08}
B:字符 b 的 ASCII 码为 98,a++ 后变为 99,对应字符 c;由于 a 是 char 类型,cout 输出字符 c 而非数字 99。
已知 a 为 int 类型变量,下列表达式不符合语法的是( )。
D:a++3 语法错误,自增运算符 ++ 之后不能紧跟数字;&a+3、+a&3、a- -4 都是合法表达式,C 中 a- -4 即 a-(-4)。
下列关于 C++ 语言中指针的叙述,不正确的是( )。
C:结构体中的指针成员可以指向自身类型(如链表结点里的 next 指针),自引用结构正是链表、树结点的实现基础,C 说不能指向该结构类型,错误。
下列关于 C++ 类的说法,错误的是( )。
C:定义类对象时不一定会调用默认构造函数,例如可用带参数的构造函数创建对象;值传递调用复制构造、赋值调用赋值运算符、派生类构造必调基类构造都正确,故 C 错误。
某二叉树 T 的先序遍历序列为:{ABDCEGHF},中序遍历序列为:{DBAHGECF},则下列说法中正确的是( )。
A:由先序定根、中序分左右:A(B(D), C(E(G(H)), F)),右侧最深到 5 层故高为 5;叶只有 D、F、H 三个,且左右子树高差超过 1 非平衡。
一棵完全二叉树有 个结点,则叶结点有多少个?( )
C:前 8 层满共 2⁸−1=255 结点,第 9 层有 431−255=176 个结点;第 8 层 128 个结点中前 88 个有孩子,余 40 个为叶,叶共 176+40=216。
下列关于树的说法,错误的是( )。
A:二叉树中序遍历与深度优先遍历不一定相同,例如先序、后序遍历都与中序不同;A 声称总相同是错的,而 B、C、D 的说法都正确,故选 A。
一个简单无向图有 个结点、 条边。再增加多少条边可以成为完全图。( )
B:10 个结点的简单无向完全图每对顶点之间都有一条边,共 C(10,2)=45 条;现有 30 条边,还需再增加 45−30=15 条。
以下哪个方案可以合理解决或缓解哈希表冲突( )。
D:把新元素放入冲突位置之后的第一个空位,即线性探测法,能妥善保存数据,是合理的冲突处理;丢弃、覆盖旧元素或覆盖下一位置都会破坏数据。
一个迷宫,已知从起点不经过重复结点到达终点的路径有且仅有一条,则下面说法错误的是( )。
D:迷宫内与起点连通的结点经 S 中转必与终点连通(连通性不要求路径不相交),但连通块内可能含环(如 lollipop 结构),不能抽象成无向无环图,D 错误;A、B、C 均正确。
下面程序的输出为( )。
01#include <iostream> 02#include <cmath> 03using namespace std; 04int main() { 05 cout << (int)log(8) << endl; 06 return 0; 07}
A:log 是自然对数 ln,log(8)=ln8≈2.079,介于 2 与 3 之间;(int) 强制类型转换截断小数部分得 2。
下面程序的输出及其时间复杂度:
01#include <iostream> 02#define N 10 03using namespace std; 04int path[N][N]; 05int main() { 06 for (int i = 1; i < N; i++) 07 path[i][0] = i; 08 for (int j = 1; j < N; j++) 09 path[0][j] = j; 10 for (int i = 1; i < N; i++) 11 for (int j = 1; j < N; j++) 12 path[i][j] = path[i - 1][j] + path[i][j - 1]; 13 cout << path[8][4] << endl; 14 return 0; 15}
下面程序的输出为( )。
(2 分)该程序的时间复杂度为( )。
(2 分)下面 fib 函数的时间复杂度为( )。
编者注:官方原题 B 选项此处写作 ,但该数小于 ,与递归时间复杂度及官方答案 B 矛盾;本题按题意修正为 。
01int fib_rcd[MAX_N]; 02int fib(int n) { 03 if (n <= 1) 04 return 1; 05 if (fib_rcd[n] > 0) 06 return fib_rcd[n]; 07 return fib(n - 1) + fib(n - 2); 08}
B:函数只读 fib_rcd 却从未写入,记忆化形同虚设,每次仍递归 fib(n-1)+fib(n-2),复杂度为指数级 O(φⁿ),φ=(√5+1)/2。
下列选项中,哪个可能是下图的广度优先遍历序列( )。
A:BFS 逐层扩散:从 1 出发第一层访问其邻点 3、5、7,第二层 4、2,第三层 6、8、9;其余选项层次顺序与图中邻接关系不符。
表达式 'a' << 1 的结果为 'a '。( )
错。'a' 是 char 类型 97,'a'<<1 左移一位得 194(int),不是字符串;且位移结果类型为 int 而非 char。
在 C++ 语言中,函数可以定义在另一个函数定义之内。( )
错。C++ 不允许在函数体内再定义函数(即不支持嵌套函数定义),函数定义只能出现在命名空间、类或全局作用域等函数之外,故说法错误,故错。
选择排序一般是不稳定的。( )
对。选择排序每趟把未排序区的最小值与当前位置交换,可能把相等的元素换到另一个相等元素之后(相对顺序被破坏),故一般不稳定。故对,故对。
埃氏筛法和欧拉筛法都是使用筛法思想生成素数表的算法,欧拉筛法的时间复杂度更低。( )
对。埃氏筛复杂度 O(n log log n),欧拉筛(线性筛)每个合数只被最小质因子筛一次,复杂度 O(n),更低,故说法正确,故对。
使用 math.h 或 cmath 头文件中的正弦函数,表达式 sin(30) 的结果类型为 double、值约为 。( )
错。sin 的参数是弧度:sin(30) 求 30 弧度的正弦约 −0.988,不是 0.5;sin30° 才是 0.5。故说法错误。
一颗 N 层的完全二叉树,一定有 个结点。( )
错。N 层完全二叉树最后一层可以不满,结点数在 2^(N−1) 到 2^N−1 之间,不一定等于 2^N−1(那是满二叉树),故错。
一个图,不管是否连通,都可以使用深度优先搜索算法进行遍历。( )
对。图不管是否连通,都可对每个连通分量分别执行 DFS:从一个未访问顶点深搜完整个分量,再找下一个未访问顶点开新一轮,直至全部访问。
某个哈希表键值 x 为整数,H(x) = x % p 是常用的哈希函数之一,要求 p 选择素数是因为这样不会产生冲突。( )
错。p 取素数只是让哈希分布更均匀、减少冲突,并不能保证无冲突:如 p=7 时 7 与 14 的哈希值都为 0,仍会产生冲突,故错。
使用单链表实现队列时,链表头结点作为队首比链表头结点作为队尾更便于操作。( )
对。队首在链表头可 O(1) 出队、O(1) 入队(头插);队首在链表尾则入队 O(1) 但出队需 O(n) 找前驱,故头结点作队首更便。
一个图中,每个结点表达一个人,连接两个结点的边表达两个结点对应的人相互认识,则这个图可以用来表达社交网络。( )
对。以人为顶点、两人之间认识为边,社交网络中人与人的关系可抽象成无向图,图中连通块即社交圈子,用图表达社交网络完全可行。故对,故对。