#1898. 数据结构和算法选择题

数据结构和算法选择题

一、单选题(每道题2分,满分50分)

第 1 题

1、以下案例中适合用枚举算法的是哪一项( )​

{{ select(1) }}

  • 10位同学需要按照身高由小到大排序。
  • 有无穷多个数字,找出里面的质数。
  • 有一筐苹果(个数不确定),为所有苹果贴标签。
  • 35个人的班级里,找出身高在120cm以上的同学。

第 2 题

2、使用二分算法,在1~500(包含1和500)之间猜数字77,依次取出的中间值是?( ) 中间值=(最小值+最大值)/2。

{{ select(2) }}

  • 250, 125, 187, 218, 77
  • 251, 125, 63, 94, 77
  • 250, 125, 62, 93, 77
  • 125, 63, 94, 77

第 3 题

3、观察下方数字序列,第一次二分处理时中间值mid为5,要找的数字为8,L、R的值要如何变化( )

{{ select(3) }}

  • R=mid+1
  • R=mid-1
  • L=mid+1
  • L=mid-1

第 4 题

4、二分查找算法适用于哪种数据结构? ( )

{{ select(4) }}

  • 有序数组
  • 链表
  • 二叉树
  • 哈希表

第 5 题

5、二分查找的循环条件通常是什么?( )

{{ select(5) }}

  • left <= right
  • left < right
  • left >= right
  • left > right

第 6 题

6、有向图每个结点的度等于该结点的( )

{{ select(6) }}

  • 入度
  • 出度
  • 入度和出度之和
  • 入度和出度之差

第 7 题

7、插入排序的基本思路是?

{{ select(7) }}

  • 反复交换相邻元素​
  • 从无序部分取元素插入到有序部分​
  • 选择最值元素排列​
  • 分桶后再合并​

第 8 题

8、大整数通常采用哪种方式存储以方便运算?

{{ select(8) }}

  • 单个整数变量直接存储​
  • 字符串或数组,每位存储一个数字​
  • 浮点数存储​
  • 二进制文件加密存储​

第 9 题

9、对于递推关系 a(n)=2*a(n−1)+1,初始条件 a(1)=1,则 a(3)的值为?

{{ select(9) }}

  • 7
  • 15
  • 3
  • 5

第 10 题

10、斐波那契数列从第 3 项开始,每一项等于前两项之和,其递推公式中,F (5) 的值为( )(已知 F (1)=1,F (2)=1)

{{ select(10) }}

  • 3
  • 5
  • 8
  • 13

第 11 题

11、有一个递推关系 f (n) = f (n-1) + n,f (1)=1,则 f (4) 的值是​( )

{{ select(11) }}

  • 10
  • 11
  • 12
  • 13

第 12 题

12、计算 1+2+3+…+n,其递推公式可以表示为​ ( )

{{ select(12) }}

  • S (n) = S (n-1) + n​
  • S (n) = S (n-1) × n​
  • S (n) = S (n-1) - n​
  • S (n) = S (n-1) ÷ n

第 13 题

13、使用链表存储数据,内存中可用存储单元地址( )

{{ select(13) }}

  • 必须连续
  • 部分地址必须连续
  • 一定不连续
  • 连续不连续均可

第 14 题

14、单链表的结点有几部分组成( )

{{ select(14) }}

  • 两部分,一部分存储结点值,另一部分存放指针
  • 只有一部分,存放结点值
  • 只有一部分,存放指针
  • 两部分,一部分存放结点值,另一部分存放结点所占内存

第 15 题

15、在链表中,若p所指向的结点不是最后结点,在p之后插入s所指结点,则执行( )

{{ select(15) }}

  • p->next=s; s->next=p;
  • s->next=p->next; p->next=s;
  • s->next=p->next; p=s;
  • s->next=p; p->next=s;

第 16 题

16、在一个链表中,结点只有指向后继的指针,若删除p所指结点的后继结点,则执行( )

{{ select(16) }}

  • p->next=p->next->next;
  • p=p->next; p->next=p->next->next;
  • p->next=p->next;
  • p=p->next->next;

第 17 题

17、有一空栈S,入栈序列为a、b、c、d、e、f,依次进行:入栈、入栈、出栈、入栈、入栈、出栈的操作,完成操作后栈底的元素是 ( )

{{ select(17) }}

  • b
  • a
  • d
  • c

第 18 题

18、对于入栈序列为a、b、c、d、e、f、g的序列,下列( )不是合法的出栈序列。

{{ select(18) }}

  • a、b、c、d、e、f、g
  • a、d、c、b、e、g、f
  • a、d、b、c、g、f、e
  • g、f、e、d、c、b、a

第 19 题

19、已知队列(13,2,11,34,41,77,5,7,18,26,15,),第一个进入队列的元素是13,则第五个出队的元素是( )

{{ select(19) }}

  • 5
  • 41
  • 77
  • 13

第 20 题

20、设循环队列的数组长度为n,其头尾指针分别为f和r,则其元素个数为( )

{{ select(20) }}

  • r-f
  • r-f+1
  • (r-f)%n+1
  • (r-f+n)%n

第 21 题

21、对表达式a+(b-c)*d的前缀表达式为( ),其中+、-、*是运算符。

{{ select(21) }}

  • *+a-bcd
  • +a*-bcd
  • abc-d*+
  • abc-+d

第 22 题

22、一棵具有5层的满二叉树的结点个数为( )

{{ select(22) }}

  • 31
  • 32
  • 33
  • 16

第 23 题

23、根结点的高度为1,具有61个结点的完全二叉树的高度为( )

{{ select(23) }}

  • 7
  • 8
  • 5
  • 6

第 24 题

24、一棵二叉树的后序序列为DGJHEBIFCA,中序序列为DBGEHJACIF,则其先序序列为( )

{{ select(24) }}

  • ABCDEFGHIJ
  • ABDEGHJCFI
  • ABDEGJHCFI
  • ABDEGHJFIC

第 25 题

25、一棵二叉树的层次序列为ABECDFG,中序序列为CBDAFEG,则其后序序列为( )

{{ select(25) }}

  • ABCDEFG
  • CBDFGEA
  • CBDFEGA
  • CDBFGEA

二、程序代码填空题(每空2分,共30分)

1、上船问题

【题目描述】 有 n 个人,需要过河,第 i 个人的体重为wi,河边有很多船,每艘船的最大载重为m且最多可以上两个人,问最少需要多少艘船。 【输入描述】 第一行输入两个整数 n 和 m,表示人数和船的载重。 第二行 n 个整数,用空格隔开,表示体重。 【输出描述】 一个整数,表示需要的最少船只。 【样例输入】 6 120 15 17 102 70 90 68 【样例输出】 4 【数据范围与提示】 1≤n,m≤200,1≤wi≤100,wi≤m

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m,a[201];
	cin>>n>>m;//变量n存储人数,m船载重
	for(int i=0;i<n;i++) cin>>a[i];//定义数组存储每个人的体重并输入
	sort(a,a+n);//对体重进行从小到大的排序
	int i=0,j=___① ___,ans=0;
	while(i<=j) {//使用循环获取最少用船数量。
		if(i___②___j){
			ans++;break;
		}
		if(a[i]+a[j]___③ __m){
			i___④___; 
		}
		j___⑤___;
		ans++;
	}
	cout<<ans; 
	return 0;
}

填写说明:以下填写内容中不要加空格

第 26 题 ①处应该填写{{ input(26) }}


第 27 题 ②处应该填写{{ input(27) }}


第 28 题 ③处应该填写{{ input(28) }}


第 29 题 ④处应该填写{{ input(29) }}


第 30 题 ⑤处应该填写{{ input(30) }}


2、快速排序

快速排序比普通排序算法速度快,每次快排都可以把序列分成两部分,一部分小于基准值,一部分大于基准值。

快速排序操作流程 1、取基准值,做左右标记 2、移动元素。(升序) j元素与基准值比较,小了往i上面放(往左放) i元素与基准值比较,大了往j上面放(往右放) 3、固定基准值 基准值被固定好时就完成了一次快速排序。

有数字序列:4、1、6、3、2、5,现在对序列做升序排列。这里选择用快速排序来实现。 以上就是快速排序在完成一次次排序时体现的层级关系。 递归思想:快速排序可用递归处理。

#include<iostream>
using namespace std;
int a[101];
void qsort(int left,int right){
	if(left>=right) return ;
	int x=a[__①__],i=left,j=right;
	while(i<j){
		while(__②__&&a[j]>=x) j--;
		a[i]=a[__③__];
		while(i<j&&a[i]<=x) __④__;
		a[j]=a[i];
	}
	a[i]=__⑤__;
	qsort(left,i-1);
	qsort(i+1,right);
} 
int main(){
	for(int i=1;i<=6;i++) cin>>a[i];
	qsort(1,6);
	for(int i=1;i<=6;i++) cout<<a[i]<<" ";
	return 0;
} 

填写说明:以下填写内容中不要加空格

第 31 题 ①处应该填写{{ input(31) }}


第 32 题 ②处应该填写{{ input(32) }}


第 33 题 ③处应该填写{{ input(33) }}


第 34 题 ④处应该填写{{ input(34) }}


第 35 题 ⑤处应该填写{{ input(35) }}


3、利用先序和中序字符串构建树

【问题描述】 给定一棵二叉树的先序遍历和中序遍历,求其后序遍历。 【输入格式】 读入 2 个两个字符串,每个一行,长度均小于等于 26。 第一行为先序遍历,第二行为中序遍历。 二叉树中的结点名称以大写字母表示: A,B,C... 。 【输出格式】 输出一行,为后序遍历的字符串。 【输入样例】 ABCDE BADCE 【输出样例】
BDECA

#include<bits/stdc++.h>
using namespace std;
struct node{
	char data;
	int left,right;
}BTree[30];
string pre,mid;//pre先序遍历字符序列,mid中序遍历的字符序列
int p=0;//全局变量,代表接下来向BTree数组里存储数据的位置(下标) 
/*getTree函数功能:利用先序和中序构建二叉树,存储二叉树数据到BTree结构体数组里
参数:pre字符串中目标树的先序遍历字符串字符左边界和右边界,中序遍历字符串字符的左边界和右边界 
返回值:构建好的这棵树的根结点编号(在BTree里的数组下标) 
*/ 
int getTree(int pl,int pr,int ml,int mr){ 
	if(ml>mr) return -1;//-1代表空树  if(ml>mr)也可以换成if(pl>pr) ---递归结束条件! 
	int t=p++;//t是本次要存储的位置,p++的意思是下次要往下一个位置存储
	BTree[t].data=pre[__①__];//1、把先序序列根结点数据存储在BTree相应位置的data数据域里
	int i=__②__;//从中序序列的开头处开始往后进行查找 
	while(i<=mr&&mid[i]!=pre[pl]) i++;//2、中序序列字符串中查找根结点位置,记录在变量i里 
	int len=i-ml;//计算左子树中结点个数
	BTree[t].left = getTree(pl+1, __③__, ml, __④__);//3、构建左子树,返回值赋值给当前根结点的left域 
	BTree[t].right = getTree(pl+len+1, pr, __⑤__, mr);//4、构建右子树,返回值赋值给当前根结点的right域 
	return t;//返回构建好的这棵树的根结点编号(在BTree里的数组下标) 
} 
void postOrder(int root){//后序遍历 
	if(root>=0){
		postOrder(BTree[root].left);
		postOrder(BTree[root].right);
		cout<<BTree[root].data;
	}
} 
int main(){
	cin>>pre>>mid;//输入先序遍历字符序列和中序遍历的字符序列 (要求:两个字符串长度相等)
	int n=pre.size();//先序遍历字符序列里字符的个数,也就是代表一共有多少个结点
	int root=getTree(0,n-1,0,n-1);
	postOrder(root);//后序遍历 
	return 0;
}

填写说明:以下填写内容中不要加空格

第 36 题 ①处应该填写{{ input(36) }}


第 37 题 ②处应该填写{{ input(37) }}


第 38 题 ③处应该填写{{ input(38) }}


第 39 题 ④处应该填写{{ input(39) }}


第 40 题 ⑤处应该填写{{ input(40) }}