一.选择题
1.文件传输协议是( )上的协议
网络层
运输层
应用层
物理层
2.对于int a[1],可以用a++来指向数组的第二个元素
是
否
解析:数组内只有一个元素所以下一个地址不为数组元素地址
3.哪一个协议用来将IP地址映射为MAC地址?
TCP/IP//传输协议
RARP//将MAC转化为IP
ARP
AARP
4.单链表的存储密度()
大于 1;
等于 1;
小于 1;
解析:首先公式是:存储密度=单链表数据项所占空间/结点所占空间 。
说到存储密度,我们通常会将链表和顺序表进行比较。
顺序表的空间全部用来存储数据,没有浪费空间,所以每个元素的存储密度为1。
而链表的每个结点除了存放数据元素,还要附加一个指示元素之间逻辑关系的指针,每个元素并非全部用来存储数据项,因此肯定小于1。
也因而从结点的存储密度上讲,顺序表的存储空间利用率较高。
5.假设某C工程包含a.c和b.c两个文件,在a.c中定义了一个全局变量foo, 在b.c中想访问这一变量时该怎么做?
在b.c中同样定义同名的foo
a.c中声明时extern int foo
b.c中声明时extern int foo
在一个工程中就可以访问到,不用做任何操作
6.下列选项中,会导致用户进程从用户态切换到内核的操作是?
I. 整数除以零
II. sin( )函数调用
III. read系统调用
仅 I、II
仅 I、III
仅 II 、III
I、II和III
解析:切换内核操作:
a. 系统调用
b. 异常
c. 外围设备的中断
7.关系中行、列次序的交换性质是( )
行可交换,列不可交换
行不可交换,列可交换
行、列均不可交换
行、列均可交换
解析:行和列均可交换,因为交换了行和列,元组是不会改变得
8.设有5000个待排序的记录的关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用下列哪个方法可以达到此目的()
快速排序
堆排序
归并排序
插入排序
解析:1.取出10个数先进行堆排序。
2.依次遍历剩下的5000-10个数,每读一个数,跟堆里最大的数进行比较,如果比堆里的最大数还大,将其舍弃读下一个数,如果比堆里的最大数小,删除最大数,将其插入到原最大数位置,并进行堆排序。
3.重复2中步骤直至5000-10个数遍历完成。
这种做法的堆排序实际上并没有将5000个数全部变为有序。
显然其他排序方法无法达到这样的效果。
9.下列不属于hash碰撞解决方法的是()。
线性探测
单旋转法
二次探测
拉链法
双重散列
多重散列
解析:常见哈希冲突解决办法:
1.开放地址法 2.线性探测法 3.链地址法(拉链法) 4.二次探测法
5.伪随机探测法 6.再散列(双重散列,多重散列) 7.建立一个公共溢出区
单旋转法是建立散列函数的一种方法, ,将最后一位数,旋转放置到第一位
常见的散列函数有,直接定址法,数字分析法,平法取中法,取余法,折叠法,随机法
10.下面关于二叉搜索树正确的说法包括________。
待删除节点有左子树和右子树时,只能使用左子树的最大值节点替换待删除节点。
给定一棵二叉搜索树的前序和后序遍率历结果,无法确定这棵二叉搜索树。
给定一棵二叉搜索树,根据节点值大小排序所需时间复杂度是线性的。
给定一棵二叉搜索树,可以在线性时间复杂度内转化为平衡二叉搜索树。
解析:A可以用右子树最小结点来替代 错误
B无法保证用先序和后序唯一确定一棵二叉树,是因为无法保证区分左右孩子。比如根节点缺失左子树或右子树这样两种不同的拓扑结构,其先序和后序遍历很可能是完全一样的。
但某些情况下,比如,如果二叉树是真二叉树,那么树中各节点有0个或2个孩子,这时就可以确定左右孩子次序,这时先序和后序可以唯一确定一棵二叉树。
C 正确, 中序遍历就可以了
D 如果允许额外的存储空间,可以先按照C生成一个排好序的数组,然后不断的找mid节点作为根来构造平衡树就是线性的,如果不允许额外空间只能靠旋转的话无法用线性时间。因为题目是单选,只能理解为不允许额外的存储空间了,
二.编程题
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。
输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。
输出描述:
输出保留下来的结果。
import java.util.Scanner;
public class Main{
public String DeleteNumbare(String str,int cnt){
StringBuffer bf=new StringBuffer();
bf.append(str);
for(int i=0;i<cnt;i++){//要删除的数的个数
int j=0;//每遍历一次重置一次
while(j+1<str.length()&&str.charAt(j)>=str.charAt(j+1)){//前一个数比后一个数大继续向后判断
j++;
}
bf.deleteCharAt(j);//如果前一位比后一位小则删除该位数
str=bf.toString();
}
return str;
}
public static void main(String[] args) throws Exception{
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int cnt=sc.nextInt();
System.out.println(new Main(). DeleteNumbare(str,cnt));
}
}