不是VIP会员,不能显示答案,请在后台“我的信息” 在线升级 VIP

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)

1. 表达式a×(b+c)-d/f转后缀表达式的结果是( )。

  • A.abc×+df-/
  • B.abc+×df/-
  • C.bc+a×df/-
  • D.abc+×-df/

2. 以下字符串中,字典序最小的是( )。

  • A.NOIP2017
  • B.NOIPC
  • C.NOIPC++
  • D.NOIPP

3. 在C++中,表达式('O'-'I')^13%9+5 的值是( )。

  • A.7
  • B.8
  • C.14
  • D.15

4. 在8个数中,找出这组数的最小值与最大值,最坏情况下最少需要比较( )次。

  • A.9
  • B.10
  • C.12
  • D.13

5. 在 TCP/IP协议族中,最核心的网络协议是( )。

  • A.UDP
  • B.HTTP
  • C.TCP
  • D.IP

6. 应用快速排序的分治思想可以实现一个求第K大数的程序。假定不考虑极端的最坏情况,理论上可以实现的最低的算法期望时间复杂度为( )。

  • A.O(n^2)
  • B.O(logn)
  • C.O(n)
  • D.O(nlogn)

7. 在解决计算机主机与外设之间速度不匹配时通常设置一个缓冲池,主要将计算机输出的数据依次写入该缓冲区,而外设从该缓冲区池中取出数据。该缓冲池应该是一个( )结构。

  • A.堆栈
  • B.队列
  • C.二叉树
  • D.链表

8. (1E34)16-(676)8的结果是( )。

  • A.(1110001111110)2
  • B.(7276)10
  • C.(1C6C)16
  • D.(16166)8

9. 一棵二叉树前序遍历为ABDECFGH,后序遍历为EDBGFHCA,以下不是可能的中序遍历的是( )。

  • A.DEBAFGCH
  • B.EDBAGFCH
  • C.DBEAFGCH
  • D.BEDAFGCH

10. 一个栈的输入顺序为1,2,3,4,5,下列序列中不可能是栈的输出序列的是( )。

  • A.54321
  • B.24135
  • C.32541
  • D.13542

11. Linux是一个用C语言写成的开源电脑操作系统内核,有大量的操作系统是基于Linux内核创建的。以下操作系统使用的不是Linux内核的是( )。

  • A.Android
  • B.CentOS
  • C.Windows
  • D.Ubuntu

12. 在下列关于计算机算法的说法中,正确的是( )。

  • A.对于一个问题,我们能通过优化算法,不断降低其算法复杂度
  • B.判断一个算法的好坏,主要依据它在某台计算机上具体实现时的运行时间
  • C.一个算法必须至少有一个输入
  • D.算法复杂度理论中,P/NP问题(NP完全问题)仍是一个未解之谜

13. 以下关于二叉树性质中,正确的描述的个数有( )。 a.包含n个结点的二叉树的高度至少为log2n; b.在任意一棵非空二叉树中,若叶子结点的个数为n0,度为2的结点数为n2,则 n0=n2+1; c.深度为k的二叉树至多有2^k个结点 d.没有一棵二叉树的前序遍历序列与后序遍历序列相同 e.具有n个结点的完全二叉树的深度为[log2[(n+1)]

  • A.0
  • B.1
  • C.2
  • D.3

14. 排序算法是稳定的,这句话的意思是关键码相同的记录排序前后相对位置不发生改变,以下排序算法不稳定的是( )。

  • A.直接插入排序
  • B.快速排序
  • C.冒泡排序
  • D.归并排序

15. 给定m种颜色和有n个点的手环,要求用这个m种颜色给这条手环染色,其中旋转和翻转能够互相得到的算同一种染色方案,如对于3个点的手环,ABC的染色方法与BCA(旋转)、ACB(翻转)是相同的。当m=2,n=2 时,一共有三种染色方案,分别为AA、AB、BB,那么当m=5,n=4时,一共有( )种染色方案。

  • A.625
  • B.160
  • C.60
  • D.120

二、阅读程序(程序输入不超过数组或字符串定义的范围;除特殊说明外,判断题1.5分,选择题4分,共计40分)

1.

#include <iostream>
using namespace std;

unsigned short tot;
void Hanoi(int n, char A, char B, char C) {
++tot;
if(n==1) {
cout<<A<<"->"<<C<<'/';
return;
}
Hanoi(n-1,A,C,B);
cout<<A<<"->"<<C<<'/';
Hanoi(n-1,B,A,C);
}

int main() {
int n;
cin>> n;
Hanoi(n,'A','B','C');
cout<<'\n'<<tot<<'\n';

return 0;
}

判断题

1) (1分)将第6行移到13行和14行之间,输出结果不会变化。( )
2) 当输入的n=2时,输出的第一行为A->B/B->C/A->C/。( )
3) 当输入的n=3时,输出的第二行为8。( )
4) 本程序的含义可以是:有三根柱子,第一根柱子从上到下依次套有编号分别为1~n的圆环,现在每次可以移动某个柱子顶部的圆环到另一个桂子的顶部上,并且要求编号较大的圆环要始终不能在编号较小的上面,输出一种操作次数最少的方案以及对应的操作次数。( )

选择题

5) 当输入的n=3时,输出的第一行的第21个字符是( )。
6) (5分)当n=17时,程序输出的第二行为( )。

2.

#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
const int N = 105;
int a[N][N];
int main() {
int n, x, y,count;
cin>> n;
memset(a,0,sizeof(a));
count=a[x=0][y=n-1]=1;
while (count<n*n) {
while (x+1<n && !a[x+1][y]) a[++x][y]= ++count;
while (y-1>=0&&!a[x][y- 1]) a[x][--y]= ++count;
while (x-1>=0&&!a[x-1][y]) a[--x][y]= ++count;
while (y+1<n &&!a[x][y+1]) a[x][++y]= ++count;
}
for (x=0; x<n; x++) {
for (y=0; y<n; y++) {
cout<<setw(5)<<a[x][y];
}
cout<<endl;
}
return 0;
}

判断题

1) (1分)删除第10行,不影响程序运行结果。()
2) 将第12行改为“while (count<= n*n){”,不影响程序运行结果。()
3) 当输入的n=4时,程序输出的a[3][2]的值为15。()

选择题

4) (3分)本题的时间复杂度为()。
5) 当输入的n=100 时,a[33][66]的值为()。

3.

#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
string s;
int main() {
int k;//限制输入0<=k<26
cin>>k>>s;
int n=s.length();
for (int i=0; i<n; i++) {
if (s[i]<='Z'&&s[i]+k>'Z')
s[i]=(s[i]+k)%'Z'+'A'-1;
else if ('A'<=s[i]&&s[i] <='Z')
s[i]+=k;
}
char pre;
int st=-1;
for (int i=0; i<n; i++) {
if(s[i]<'A'||s[i]>'Z') {
if (st==-1) {
st=i;
pre=s[i];
} else {
char tmp=s[i];
s[i]=pre;
pre=tmp;
}
}
}
if(st !=-1)
s[st]=pre;
cout<<s<<endl;
return 0;
}

判断题

1) (1分)删除第30行和第31行,不影响程序运行结果。( )
2) 如果输入的s不含大写字母,则输出结果与k的值无关。( )
3) 如果知道输出结果,能够反推出唯一的输入结果。( )
4) 当k的值确定时,不存在两个不同的输入使得输出相同。( )

选择题

5) 如果输入是6 KU96APY5,则输出为( )。
6) (5分)如果输出是ab1287F2Tguz,则输入可能为( )。

三、完善程序(单选题,每题3分,共计30分)

1. (拓扑排序)
在我们所学的课程中,部分课程之间可能存在依赖关系,如我们在学习图论知识之前,需要先学习离散数学中的基础知识。一门课可能有若干先修课程。现在李老师需要安排一些课程的授课计划,排课需要遵从一定的规则,即只有修习完某课程的全部课程后,才能修习该课程。
在本例中,用1~n表示n个课程,用x y表示x是y的先修课程,输入数据保证图中没有环与重边。要求输出任意一个可行的授课顺序。图用邻接矩阵方法储存。

#include <iostream>
#include <cstring>
# include <queue>
using namespace std;
const int N=105;
int a[N][N];
int in[N],s[N];
int n,m,u,v;
void Topo() {
queue<int> q;
int cnt;
for(int i=1; i<=n; i++)
if(___(1)___)
q.push(i);
while(!q.empty()) {
int cur = q.front();
q.pop();
s[cnt++]=___(2)___;
for (int i=1; i<=n; i++) {
if (___(3)___) {
___(4)___;
if (in[i]==0)
q.push(i);
}
}
}
}
int main() {
memset(in,0,sizeof(in));
memset(a, 0,sizeof(a));
cin>>n>>m;
for (int i=0; i<m; i++) {
cin>>u>>v;
in[v]++;
___(5)___;
}
Topo();
for (int i=0; i<n; i++) {
if (i)
cout<<' ';
cout<<s[i];
}
cout<<endl;
return 0;
}


选择题

1) ①处应填( )
2) ②处应填( )
3) ③处应填( )
4) ④处应填( )
5) ⑤处应填( )

2. (8一皇后问题)要求用回溯法求解8-皇后问题,使放置在8*8棋盘上的8个皇后彼此不受攻击,即:任何两个皇后都不在同一行、同一列或同一斜线上。请输出8皇后问题的所有可行解。

#include <iostream>
#include<cmath>
using namespace std ;

bool Place(int k,int i,int * x) {
for (int j=0; j<k; j++)
if ((x[j]==i)||___(1)___)
return false;
return true;
}

void NQueens(int k, int n, int *x) {
for (int i=0; i<n; i++) {
if (Place(k,i,x)) {
___(2)___;
if(___(3)___) {
for (int j=0; j<n; j++) cout<<x[j]<<" ";
cout<< endl;
}
else {
___(4)___;
}
}
}
}
int main() {
int x[8];
for (int i=0; i<8; i++)x[i]=-1;
___(5)___;
return 0;
}



选择题

1) ①处应填( )
2) ②处应填( )
3) ③处应填( )
4) ④处应填( )
5) ⑤处应填( )