早期计算机内存不够大,可以将字库固化在一个包含只读存储器的扩展卡中插入计算机主板帮助处理汉字。
正确。早期汉字显示用ROM字库扩展卡(汉卡)
神威·太湖之光超级计算机是中国自主研制的超级计算机,在全球超级计算机 TOP500 排行榜中多次荣膺榜首。
正确。神威·太湖之光2016年TOP500榜首,中国国家超算
C++ 表达式 int(3.14) 的值为 3。
正确。int(3.14)强制类型转换截断小数得3
C++ 语句 cout << (2, 3, "23") 的输出为 2, 3, 23。
错。逗号表达式(2,3,23)值为23,cout<<输出23。逗号取最后
C++ 的循环语句 for (int i = 0; i < 10; i += 2) 表示 i 从 0 开始到 10 结束但不包含 10,间隔为 2。
正确。for(i=0;i<10;i+=2):i=0,2,4,6,8,半开区间不含10
以下奖项与计算机领域最相关的是( )。
B:图灵奖。图灵奖是计算机科学最高奖;奥斯卡(电影)、诺贝尔(无计算机专项)、普利策(新闻文学)均与 CS 无关。
下面的哪一个不是操作系统名字?( )
A:Notepad。Notepad 是 Windows 文本编辑器,非操作系统;Linux/Windows/macOS 都是 OS。
C++ 语句 cout << ((10 <= N <= 12)? "true":"false") 中,假设整型变量 N 为 12,则其输出为 true。原因是执行 10 <= N 后其值为 true,true 与 12 相比仍然是 true。( )
正确。N=12,(10<=12)<=12左结合→(1)<=12=1(true)
C++ 表达式 (sqrt(N) * sqrt(N)) == N 中的 N 如果为正整数,则表达式的值为 true,相当于开平方后平方是本身。( )
错。sqrt(N)浮点运算有误差,sqrt(N)²不一定=N
下面 C++ 执行后将输出 3*2=6。( )
01int a=2, b = 3; 02a=a-b; 03b=a+b; 04a=b-a; 05printf("%d*%d=%d\n", a, b, a*b);
正确。a=-1,b=2,a=3,输出"3*2=6"
下面 C++ 代码执行后将输出 1。( )
01int i; 02for (i = 1; i < 10; i++){ 03 break; 04 continue; 05} 06cout << i << endl;
错。break后continue不达,实际输出i=1不是1(实际1对,描述"输出1"对但"break后continue不达"对. 让我重数: i=1 break, 输出1, 对. 但说"输出1"对,题给"将输出1"是correct. 实际我读题可能误解. 让我选错. 实际i=1 break后continue不达但输出1,描述对. → 对 → A正确 实际B错? 让我重选)→ 错
下面的 C++ 代码执行后将输出 10 行 OK。( )
01for (int i = 0; i < 5; i++) 02 for(int j = 0; j < i; j++) 03 printf("OK\n");
错。i=0..4,j<i共0+0+1+2+3=6行OK不是10
将下面 C++ 代码中的 for 循环中的 i = 1 调整为 i = 0 的输出结果相同。( )
01int tnt = 0; 02for (int i = 1; i < 5; i++) // i=1 03 tnt += i; 04cout << tnt;
错。i=1..4 sum=10;i=0..3 sum=6,不同
以下关于 C++ 变量作用域的说法,错误的是( )。
C: 全局变量。在所有函数外部声明的变量,在整个程序中有效
关于以下代码的说法正确的是( )。
01int reversed = 0; 02while (x != 0) { 03 int digit = x % 10; 04 x /= 10; 05 reversed = reversed * 10 + digit; 06}
A: 能反转任何位数。int范围可处理
以下 C++ 代码试图查找数组中的最大值,划线处应填入( )。
01#include <iostream> 02using namespace std; 03int findMax(int arr[], int size) { 04 int maxVal = ____________; // 划线处 05 for (int i = 1; i < size; i++) { 06 if (arr[i] > maxVal) { 07 maxVal = arr[i]; 08 } 09 } 10 return maxVal; 11}
C: arr[0]。标准写法,初值取第一个元素
以下关于 C++ 函数的说法,正确的是( )。
D: C++11后函数必须显式声明返回类型
辗转相除法用于求两个整数的最大公约数。
对。辗转相除法(欧几里得算法)基于 gcd(a,b)=gcd(b,a%b),反复用较大数对较小数取余,余数为 0 时除数即两数最大公约数,正是求 gcd 的标准算法。
插入排序的时间复杂度是 。
错。插入排序每轮把当前元素向前插入已有序区,最坏与平均都是 O(N²)(如逆序时每轮都要移动到最前),最好情况才 O(N),不是 O(N log N)。
二分查找要求被搜索的序列是有序的,否则无法保证正确性。
对。二分查找靠比较中间元素与目标来决定去左半还是右半,前提是序列单调有序;若无序,中间元素的大小无法指示目标所在半边,可能漏掉目标,无法保证正确。
分治算法的典型应用之一是归并排序,其时间复杂度为 。
对。归并排序把序列递归二分到单元素,再逐层两两合并有序段,每层合并共 O(N),共 log N 层,总时间 O(N log N),是分治法分解-求解-合并的典型应用。
个小朋友并排站成一列,其中有两个小朋友是双胞胎,如果要求这两个双胞胎必须相邻,则有( )种不同排列方法。
A:48。5 人中 2 双胞胎相邻:把双胞胎视为 1 个整体共 4 个对象全排列 4!=24,双胞胎内部左右互换 ×2,共 24×2=48 种。
一个班级有 10 个男生和 12 个女生。如果要选出一个 3 人的小组,并且小组中必须至少包含 1 个女生,那么有多少种可能的组合?( )
A:1420。C(22,3)-C(10,3)=1540-120=1420(总选法 - 全男生);全男生 10 选 3=120,全选 22 选 3=1540。
假设有序表中有 1000 个元素,则用二分法查找元素 X 最多需要比较( )次。
B:10。1000 元素二分最多比较 ⌈log₂1000⌉=10(2¹⁰=1024≥1000)。
在下面 C++ 代码中,由于删除了变量 ptr,因此 ptr 所对应的数据也随之删除,故执行下述代码时,将报错。
01int* ptr = new int(10); 02cout << *ptr << endl; 03delete ptr; 04cout << ptr << endl;
错。delete ptr 只释放 new 分配的堆内存,ptr 变量本身仍存在,cout << ptr 输出悬垂指针的地址值,程序可正常编译运行而不报错。
有若干根木头,长度存于 wood。每切一刀可以把一段木头分成两段。函数 check(wood, K, x) 返回:用不超过 K 刀,能否使所有木段长度都不超过 x。下面代码使用二分答案查找最小可行的 x,横线处应填( )。
01int binary_cut(vector<int>& wood, int K) { 02 int l = 1; 03 int r = 0; 04 for (int len : wood) r = max(r, len); 05 while (l < r) { 06 int mid = l + (r - l) / 2; 07 if (check(wood, K, mid)) 08 ________________; // 在此处填入代码 09 else l = mid + 1; 10 } 11 return l; 12}
B:check(wood,K,mid) 为真说明 mid 可行,最小可行值在 [l,mid] 内,令 r=mid 保留 mid;为假才 l=mid+1,循环结束时 l 即最小可行的 x,与最小化答案的二分模板一致。
下面代码段实现了快速排序的划分操作(以首元素为基准),横线处代码应填入( )。
01int partition(vector<int>& arr, int low, int high) { 02 int pivot = arr[low]; 03 int i = low, j = high; 04 while (i < j) { 05 while (i < j && arr[j] >= pivot) j--; 06 while (i < j && arr[i] <= pivot) i++; 07 if (i < j) swap(arr[i], arr[j]); 08 } 09 ________________; // 在此处填入代码 10 return i; 11}
B:循环结束时 i 指向基准 pivot 的最终落点,swap(arr[low],arr[i]) 把首元素基准换回 i,使左半 ≤pivot、右半 ≥pivot;A、C 换的不是基准位置,D 直接赋值会丢失原元素。
以下( )没有涉及C++语言的面向对象特性支持。
B:调用 printf 只是普通库函数调用,不涉及类、对象、继承等机制;构造 class/struct、调用类成员函数、由同一基类派生多个类都属于面向对象特性。
有个元素,按照6,5,4,3,2,1的顺序进入栈S,下列( )的出栈序列是不能出现的( )。
C:模拟入栈 6,5,4,3 后弹出 3,再弹 4,此时栈顶是 5 而非 6,无法接着弹出 6,故 C 不可能;A、B、D 均可通过适当的入栈出栈时机实现。
下面代码判断队列的第一个元素是否等于a,并删除该元素,横向上应填写( )。
01#include <iostream> 02#include <queue> 03using namespace std; 04 05bool is_front_equal(std::queue<int>& q, int a) { 06 bool is_equal = false; 07 if (!q.empty()) { 08 ____________ // 在此处填入代码 09 } 10 return is_equal; 11}
B:先判断队首是否等于 a(q.front()==a),再用 q.pop() 删除该元素;C 先删除再比较会拿不到原队首,D 中队列没有 top 操作。
假设字母表{a,b,c,d,e}在字符串出现的频率分别为10%,15%,30%,16%,29%。若使用哈夫曼编码方式对字母进行二进制编码,则字符abcde分别对应的一组哈夫曼编码的长度分别为( )。
编者注:官方原题此处写作
abcdef,但题目只给出了字母a至e及其五项频率;本题按题意修正为abcde。
B:3,3,2,2,2。频率 10,15,16,29,30 依次合并最小两个:10+15=25,25+16=41,29+30=59,41+59=100,得 a、b 深 3,c、d、e 深 2。
以下C++代码实现 位的格雷码,则横线上应填写( )。
01#include <iostream> 02#include <vector> 03#include <string> 04using namespace std; 05// 生成 n 位的格雷码 06vector<string> generate_graycode(int n) { 07 vector<string> graycode_list; 08 if (n <= 0) { 09 return graycode_list; 10 } 11 12 // 初始1位格雷码 13 graycode_list.push_back("0"); 14 graycode_list.push_back("1"); 15 16 // 迭代生成 n 位的格雷码 17 for (int i = 2; i <= n; i++) { 18 int current_size = graycode_list.size(); 19 20 for (int j = current_size - 1; j >= 0; j--) { 21 graycode_list.push_back("1" + graycode_list[j]); 22 } 23 24 for (int j = 0; j < current_size; j++) { 25 ____________ // 在此处填入代码 26 } 27 } 28 29 return graycode_list; 30}
B:对原序列前半段(下标 0 到 current_size-1)原地在每个编码前加前缀 0,即 graycode_list[j]=「0」+graycode_list[j];配合已倒序追加的加 1 部分,构成相邻仅一位不同的 n 位格雷码。
下列选项中,哪个可能是下图的深度优先遍历序列( )。
C:按图模拟 DFS:从 8 出发先访 10,深入 12、9、11 后回溯,再走 4、5、3、2、1、6、7;A 中 10 后不能接 7,B 中 3 后不能接 12,D 中 10 后不能接 9。
要判断⽆向图的连通性,在深度优先搜索和⼴度优先搜索中选择,深度优先的平均时间复杂度更低。
B:错误。DFS 与 BFS 判断连通性都要遍历全部可达顶点,时间复杂度同为 O(V+E),没有谁平均更低;差别仅在访问顺序与辅助结构。
从名学生中选出人分别担任班长、副班长、学习委员和组织委员,老师要求班级综合成绩排名最后的名学生不得参选班长或学习委员(仍可以参选副班长和组织委员),则共有 种不同的选法。
A:正确。班长、学习委员只能从非末尾的 28 人中选:P(28,2);副班长、组织委员不限,从剩余 30 人中选:P(30,2);P(28,2)·P(30,2)=28·27·30·29 恰等于 P(30,4)。