⼩杨家响应国家“以旧换新”政策,将⾃家的汽油车置换为新能源汽车,正在准备⾃编车牌。⾃编车牌包括 位数字或英⽂字母,要求第 位必须是数字,前 位中可以有最多 位英⽂字母。英⽂字母必须是⼤写,⽽且不能是 或 (因为容易与数字 或 混淆)。请问⾃编车牌共有多少种可能性?( )。
B:1060000。第 5 位固定为数字 10 种;前 4 位分类:全数字 10⁴=10000 种,恰 1 位字母 4×24×10³=96000 种(24 个可用大写字母);合计 10×(10000+96000)=1060000。
新年到,四家⼈在⼀起聚会。其中两家有三⼝⼈,另外两家有两⼝⼈。现在要安排⼤家在⼀张⼗⼈圆桌坐下,要求⼀家⼈必须相邻就座。由于有“主座”的习俗,每个座位都被认为是不同的。请问共有多少种就座⽅案?( )。
A:8640。四家捆成 4 块在环形上相对顺序 (4-1)!=6 种,主座使整体可旋转 10 个位置,块内排列 3!·3!·2!·2!=144,共 6×10×144=8640。
下⾯关于C++类继承的说法,错误的是( )。
D:抽象类含纯虚函数只是不能实例化对象,不被任何类继承也能正常编译;A 多继承、B 被多个类继承、C 继承另一个类的派生类均合法。
使⽤邻接表表达⼀个简单有向图,图中包含 个顶点、 条边,则该出边表中边节点的个数为( )。
D:e。出边表中每条有向边只在起点的链表中保存一个边节点,故边节点总数等于边数 e;无向图每条边存两次才是 2e,注意有向与无向之分。
以下将⼆维数组作为参数的函数声明,哪个是符合语法的?( )。
C:int (*a)[20] 是指向含 20 个 int 的行数组的指针,与 int a[][20] 作形参等价,合法;A、B 省略列数无法寻址,D 声明的是 20 个 int 指针的数组。
已知两个点 、 在平⾯直角坐标系下的坐标分别为 和 ,并分别定义变量 double xa, ya, xb, yb; 存储坐标。假设直线 的斜率存在,下列哪个表达式可以⽤来表达它?( )。
C:(ya-yb)/(xa-xb)。斜率是纵坐标差除以横坐标差 Δy/Δx;A、B 把分子分母颠倒,D 分母取反得到 −k,均不能表示 AB 的斜率。
⼆项式 的展开式中 项的系数是( )。
C:20。x³y³ 项系数为 C(6,3),即从 6 个 (x+y) 因子中选 3 个取 y、其余取 x,C(6,3)=20。
以下关于动态规划的说法中,错误的是( )。
B:记忆化递归只计算被访问到的状态,可能比自底向上递推算全部状态更少,复杂度可以更低,『总是不低于』说法错误;只有无记忆化的朴素递归才可能更高。
在下⾯的程序中,使⽤整数表⽰⼀种组合。整数⼆进制表⽰的某⼀位为 ,表⽰该位对应的数被选中,反之为 表⽰未选中。例如,从 这 个数中选出 个,则 0b111000 代表选中选中 三个数。 三个数,0b011001 代表 zuhe_next 函数按组合对应的整数由⼤到⼩的顺序,求出组合 的下⼀个组合。横线处可以填⼊的是( )。
01int intlow2(int c) { 02 return ________; // 在此处填入选项 03} 04int zuhe_next_incur(int c, int n, int l) { 05 if (n == l) return c; 06 if ((c & (1 << l)) == 0) { 07 int d = intlow2(c); 08 c = (c & ~d); 09 c = (c | (d >> 1)); 10 } else { 11 c = (c & ~(1 << l)); 12 c = zuhe_next_incur(c, n - 1, l + 1); 13 int d = intlow2(c); 14 c = (c | (d >> 1)); 15 } 16 return c; 17} 18// 从n个数中选m个,当前组合为c 19int zuhe_next(int c, int n, int m) { 20 return zuhe_next_incur(c, n, 0); 21}
D:intlow2 求 c 的最低 1 位(lowbit)。(c-1)^c 把最低位及以下全变 1,加 1 得 lowbit 的 2 倍,右移一位即 lowbit;A、B、C 分别得 2·lowbit−1、2·lowbit、lowbit−1。
下⾯程序的输出为( )。
01#include <iostream> 02using namespace std; 03int main() { 04 int N = 15, cnt = 0; 05 for (int x = 0; x + x + x <= N; x++) 06 for (int y = x; x + y + y <= N; y++) 07 for (int z = y; x + y + z <= N; z++) 08 cnt++; 09 cout << cnt << endl; 10 return 0; 11}
A:174。x≤5(3x≤15),对每个 x 枚举 y≤z 且 y+z≤15−x:x=0 得 72,x=1 得 49,x=2 得 30,x=3 得 16,x=4 得 6,x=5 得 1,共 174。
下⾯最长公共⼦序列程序中,横线处应该填⼊的是( )。
01#define MAX(A, B) (((A) > (B)) ? (A) : (B)) 02#define MIN(A, B) (((A) < (B)) ? (A) : (B)) 03int dp[MAX_L + 1][MAX_L + 1]; 04int LCS(char str1[], char str2[]) { 05 int len1 = strlen(str1); 06 int len2 = strlen(str2); 07 for (int i = 0; i < len1; i++) 08 for(int j = 0; j < len2; j++) 09 if (str1[i] == str2[j]) 10 dp[i + 1][j + 1] = dp[i][j] + 1; 11 else 12 ___________; // 在此处填入选项 13 return dp[len1][len2]; 14}
C:str1[i]!=str2[j] 时 LCS 取 max(dp[i][j+1], dp[i+1][j]),即分别舍弃 str1[i] 或 str2[j] 后的最优值;A 是求和,B 取小值,D 多加了 1。
下列 Dijkstra 算法程序及其时间复杂度:
01typedef struct Edge { 02 int in, out; // 从下标in顶点到下标out顶点的边 03 int len; // 边长度 04 struct Edge * next; 05} Edge; 06// v: 顶点个数, graph: 出边邻接表, start: 起点下标, dis: 输出每个顶点的最短距离 07void dijkstra(int v, Edge * graph[], int start, int * dis) { 08 const int MAX_DIS = 0x7fffff; 09 for (int i = 0; i < v; i++) 10 dis[i] = MAX_DIS; 11 dis[start] = 0; 12 int * visited = new int[v]; 13 for (int i = 0; i < v; i++) 14 visited[i] = 0; 15 visited[start] = 1; 16 for (int t = 0; ; t++) { 17 int min = MAX_DIS, minv = -1; 18 for (int i = 0; i < v; i++) { 19 if (visited[i] == 0 && min > dis[i]) { 20 min = dis[i]; 21 minv = i; 22 } 23 } 24 if (minv < 0) 25 break; 26 visited[minv] = 1; 27 for (Edge * e = graph[minv]; e != NULL; e = e->next) { 28 _________; // 在此处填入选项 29 } 30 } 31 delete[] visited; 32}
下列Dijkstra算法中,横线处应该填⼊的是( )。
(2 分)假设图graph中顶点数v、边数e,该程序的时间复杂度为( )。
(2 分)下列快速排序程序及其时间复杂度:
01void quick_sort(int a[], int n) { 02 if (n <= 1) 03 return; 04 int pivot = 0, l = 0, r = n - 1; 05 while (______) { // 在此处填入选项 06 while (r > pivot && a[r] >= a[pivot]) 07 r--; 08 if (r > pivot) { 09 int temp = a[pivot]; 10 a[pivot] = a[r]; 11 a[r] = temp; 12 pivot = r; 13 } 14 while (l < pivot && a[l] <= a[pivot]) 15 l++; 16 if (l < pivot) { 17 int temp = a[pivot]; 18 a[pivot] = a[l]; 19 a[l] = temp; 20 pivot = l; 21 } 22 } 23 quick_sort(a, pivot); 24 quick_sort(______); // 在此处填入选项 25}
下⾯的快速排序程序中,两处横线处分别应填⼊的是( )。
(2 分)该程序的时间复杂度为( )。
(2 分)表达式 '3' + '5' 的结果为 '8',类型为 char。
B:错误。'3'、'5' 参与运算时自动提升为 int,按 ASCII 码相加 51+53=104,结果类型是 int、值 104,而不是字符 '8'。
在C++语⾔中,可以在函数内定义结构体,但该结构体类型只能在该函数内使⽤。
A:正确。C++ 允许在函数内部定义 struct,该类型的作用域仅限函数体内,函数外无法引用它,属于局部类型定义;全局类型才处处可用。
对 个元素的数组进⾏排序,快速排序和归并排序的平均时间复杂度都为 。但快速排序存在退化情况,使得时间复杂度升⾼⾄ ;归并排序需要额外的空间开销。
A:正确。快速排序平均 O(n log n),但每次划分严重失衡(如对已有序数组)会退化到 O(n²);归并排序稳定且始终 O(n log n),代价是需要 O(n) 辅助空间。
⼆维数组的最后⼀维在内存中⼀定是连续的,但第⼀维在内存中可能不连续。
B:错误。C++ 二维数组按行优先整体连续存放,各行(第一维)在内存中也连续,不存在『第一维可能不连续』;那是指针数组或动态二维结构。
使⽤ math.h 或 cmat.h 头⽂件中的函数,表达式 log(1000) 的结果类型为 double、值约为 。
B:错误。C++ 的 log 是自然对数,ln 1000≈6.908 而非 3;值约为 3 的是以 10 为底的对数 log10(1000)。类型为 double 这一点没错。
你有三种硬币,分别⾯值 元、 元和 元,每种硬币都有⾜够多。买⼀本书需要 元,则有 种硬币组合(组合与顺序⽆关,“ 个 元 + 个 元+ 个 元”与“ 个 元+ 个 元”认为是同样的组合)可以正好付清,且不需要对⽅找钱。
A:正确。枚举 7 元硬币数 c:c=0 时 2a+5b=27 有 3 组,c=1 时 2a+5b=20 有 3 组,c=2 时 2a+5b=13 有 1 组,c=3 时 2a+5b=6 有 1 组,共 8 种组合。
使⽤哈希函数 f(x) = x % p 建⽴键值为 int 类型的哈希表,只要 取⼩于等于哈希表⼤⼩的素数,可保证不发⽣碰撞。
B:错误。素数取模只让键分布更均匀,不同键对 p 同余时仍会映射到同一槽位;键数超过表容量时由鸽巢原理必然发生碰撞,不能保证零冲突。
杨辉三角中的第 ⾏、第 项,即为将⼆项式 展开后 项的系数。
B:错误。杨辉三角第 i 行第 j 项是 C(i-1,j-1),即 (a+b)^(i-1) 中 a^(i-j)b^(j-1) 的系数;题干未说明 n=i-1、m=j-1 的关系,笼统说成 a^(n-m)b^m 的系数不成立。
判断图是否连通,可以通过⼴度优先搜索实现。
A:正确。从任一顶点出发 BFS 逐层扩展,访问顶点数等于总顶点数则连通;存在未访问顶点说明有顶点不可达,图不连通,DFS 也可完成同样判断。
要求解⼀元⼆次⽅程 ,需要先判断表达式 a ^ 2 - b * 4 >= 0 是否为真。
B:错误。C++ 的 ^ 是按位异或而非乘方,a^2 是 a 与 2 异或;判别式应为 aa−4b,写 a^2−b*4 语义完全不对。