单选题
1.在一棵二叉树上,第5层最多拥有多少个结点?
2^(i-1)
2.对于以下二叉树,哪个是不可能遍历出的结果?
42513 中序遍历 √
12453 前序遍历 √
45213 该答案错误
13254 优先遍历右子树 √
3.12345五个数字入栈的顺序一定是从前往后的,出栈的时机不确定,以下哪个是不可能的出栈顺序?
54321 √
43512 该顺序不可能得到
43251 √
12345 √
4.n层的二叉树,最少拥有多少个结点?
n个
5.就平均性能而言,下列排序算法中哪种排序最快?
希尔 -> 最优O(n) 最差O((nlogn)^2) 平均O((nlogn)^2) ×
冒泡 -> 最优O(n) 最差O(n^2) 平均O(n^2) ×
交换 -> 交换排序包含冒泡排序、快速排序 ×
快速 -> 最优O(nlogn) 最差O(n^2) 平均O(nlogn) √
希尔排序是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序,是一种非稳定排序算法,它将待排序的数组元素按下标的一定增量分组,分成多个子序列,然后对各个子序列进行直接插入排序算法,然后依次缩减增量再进行排序,直到增量为1时,进行最后依次直接插入排序,排序结束
//冒泡排序原始版
public void bubbleSort ( int[] array){
for (int i = 0; i < data.length - 1; i++) { //比较n-1趟
for (int j = 0; j < data.length - 1 - i; j++) {
if (data[j] > data[j + 1]) {
int temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
}
}
}
}
//快速排序
public void quickSort(int[] arr, int left, int right) {
if (left > right) return;
if (arr == null || arr.length == 0) return;
int base = arr[left]; //基准数
int i = left;
int j = right;
while (i != j) { //从两边向中心,不相遇时
//先从右向左
while (arr[j] >= base && i < j) {
j--; //从右向左,大于等于基准值继续遍历
}
while (arr[i] <= base && i < j) {
i++; //当arr[j]小于基准值时,从左向右,小于基准值继续遍历
}
//右边小于基准值,左边大于基准值,进行交换,保证左边的比基准值小,右边比基准值大
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//当i与j相遇时,将基准数与相遇位置交换
arr[left] = arr[i];
arr[i] = base;
//然后对基准数左右两边的分别排序
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
6.表序列为 (b c d e f g q r s), 则在二分法查找关键字b的过程中,先后进行比较的关键字依次是
如题,可得数组为奇数,首先我们找到中间值 f ,因为 f > b,所以将f右边的全部排除,其实这里出现了一个问题,就是我们要不要把f也算入下一次二分,如果我们算入的话,则下次找到的中间值为 d,d > b,将右边的排除,继续将d算入,找到c,将右边的排除,最终找到b,比较的关键字则是 f d c b;若刚刚我们不把中间值算入下一次的话,则得到 f c b,个人感觉应该是不将中间值算入下一轮二分,所以正确答案是 f c b
7.以下哪种语言移植性最好?
机器语言
汇编语言
高级语言 √
自然语言
8.下面给出的Java中ClassLoader中的描述,哪些是描述正确的?
ClassLoader没有层次关系 × -> 它拥有上下级的层次关系(但不是继承)
所有类中的ClassLoader都是AppClassLoader × -> 有系统类加载器、扩展类加载器、应用程序加载器、自定义加载器
通过Class.forName(StringclassName),能够动态加载一个类 √
不同的ClassLoader加载同一个Class文件,所得的类是相同的 × -> JVM在判断两个类是否相同时,除了比较类名之外,还需要比较类加载器是否是同一个实例
9.下列程序的输出结果是多少?
public class Test {
static int x, y;
static {
int x = 1;
int y = 2;
}
public static void main (String[] args) {
x--;
myMethod();
System.out.println (x + y++ + x);
}
public static void myMethod () {
y = x++ + ++x;
}
}
我们需要知道已经定义过静态变量x,y之后,再在静态代码块中定义x,y是无效的,则x,y默认为0,i++是先赋值,后增加,++i是先增加,后赋值,所以最后输出2
10.以下能得到正确值的方法的是?
Short s1 = 99S;
float f = 1.0;
int tt = 018;
int t = "123".length(); √
11.以下代码输出结果是?
public class Test {
public static void main(String[] args) {
String str = "ABCDEFGHI";
String str1 = str.substring(3, 5);
System.out.println(str1);
}
}
public String subString(int beginIndex,int endIndex),其中 beginIndex是起始索引(包含),索引从0开始,endIndex是结束索引(不包含)
12.请问以下方法的时间复杂度是多少?
int n = 10;
for (i = 1; i < n; ++i) {
for (j = 1; j < n; j += n / 2) {
for (k = 1; k < n; k = 2 * k) {
x = x + 1;
}
}
}
nlogn
13.以下哪条SQL语句可以删除数据库中的表table?
DROP TABLE table √ -> DELETE用于删除表中的行,DROP用于删除表,TRUNCATE用于删除表中的数据
14.以下关于操作系统说法错误的是?
操作系统提供了编程接口和命令接口
系统调用是通过中断来实现的,当发生系统调用,处理器会从用户态变为内核态
微内核操作系统提供消息机制,比整体内核执行效率高 × 该项错误
操作系统不关心高级语言的编译器实现
15.IPv4的地址长度是多少位?
32位
16.目前的主流PC设备上,对500万个随机整数数组进行排序,需要花费的CPU时间量级是?
1秒
17.C 语言中,在语句 if (/* condition */) 的条件表达式中,下列条件会被当作真的是?
(int)0
(int)-1 √ C语言中,只有0为假,非0都为真
*(const char *)" "
(void *)NULL
18.C 语言中,对于 8 位有符号整数类型 int8_t,其有效取值范围是?
[-128,127]
19.C 语言中,对于多位数组 int a[2][3],下列表达式中,与 a[1][2] 等价的是?
*(a[1] +2 )
20.C 语言中,对于无符号整数 n,下列表达式不能用来确定 n 为偶数的是?
n % 2 == 0
n & 0x1 == 0 -> 0x1表示16进制中的1 &表示按位与,效果等于取二进制最右边的数字
n | 0x1 == n 该项不能确定
n / 2 * 2 == n
21.C 语言中,声明语句 int (*pf)(); 定义了什么?
定义了一个指向返回值类型为 int 的函数的函数指针
22.C 语言中,下面程序的输出结果为?
#include <stdio.h>
char *get_slogan() {
char str[512];
strcpy(str, "bilibili cheers");
return str;
}
int main() {
printf("%s", get_slogan());
return 0;
}
程序不会崩溃,并且会输出 bilibili cheers
程序不会崩溃,但也不会输出任何字符
程序可能输出任意字符串,也可能崩溃 √
程序一定会崩溃
23.C 语言中,下面程序的输出结果为?
#include <stdio.h>
int fib(int n) {
if (n == 0 || n == 1) return 1;
return fib(n - 1) + fib(n - 2);
}
int main() {
printf("%d", fib(8));
return 0;
}
34
24.C++语言中,下列说法错误的是?
不应在类的构造函数中若抛出异常(防止产生未完全构造的对象),构造函数中任何未捕获的异常均会终结程序 -> 该说法错误,构造函数中抛出异常将导致对象的析构函数不被执行
如果需要自定义类的析构函数来管理资源,我们往往也需要自定义该类的复制构造函数以及赋值运算符
不建议在构造函数和析构函数中调用虚函数,因为此时对象可能不完整,无法多态地调用原本类型中定义的虚函数
即使一个用户自定义类型 T,未定义任何成员 class T {},为了保证能获得实例的内存地址 sizeof(T) 也不会为 0
25.C++ 语言中,对于自定义类 T,可以使用 STL 容器 std::set<T> 的前提是?
自定义类型 T 必须存在无参数的构造函数
自定义类型 T 是平凡的,可二进制直接复制的 (POD 类型)
自定义类型 T 之间的大小关系有良定义 (如重载了 < 运算符) √
自定义类型
T的哈希值有良定义 (定义了std::hash<T>)
C++ 语言中,下面程序的输出结果为?
#include <iostream>
struct B {
virtual int foo() { return 0; }
int bar() { return 0; }
};
struct D : B {
int foo() override { return 1; }
int bar() { return 1; }
};
int main() {
int result = 0;
B obj1 = D();
D obj2 = D();
B *obj3 = &obj2;
B &obj4 = obj2;
result += obj1.foo() + obj1.bar();
result += obj3->foo() + obj3->bar();
result += obj4.foo() + obj4.bar();
std::cout << result << std::endl;
return 0;
}
2
27.定义3个变量double a ; unsigned int b ; long c ; 则表达式a + b + c的值的类型是?
double
28.默认的class成员的访问级别是?
private 看清题意是指类成员的访问级别!
29.exception是?
运行时错误
常见的编译时异常 1.FileNotFoundException
2.ClassNotFoundException
3.SQLException
4.NoSuchFieldException
5.NoSuchMethodException
6.ParseException
常见的运行时异常 1.NullPointerException
2.ArithmeticException
3.ClassCastException
4.ArrayIndexOutOfBoundsException
5.StringIndexOutOfBoundsException
30.以下程序的输出结果是
#include<stdio.h>
void main() {
int i;
float a = 5.2;
char *ptr;
ptr = (char *)&a;
for (i = 0; i <= 3; i++)
printf(“%d “, *ptr++);
}
暂未看懂这个题
编程题
题目一:最小子串
题目描述
给定字串A和字符集B,求在A中包含了B所有字符的最小子串
输入描述
输入一行字串(不会为空)
ABAKJSDYUIWNQJNDSAHDBALSDH
输入一个字符集(不会为空,也不会出现重复字符)
ABD
输出描述
输出包含了字符集所有字符的第一个最小子串,例如上面的输入对应输出DBA
如果没有符合条件的子串,则输出#
示例1
输入
ABAKJSDYUIWNQJNDSAHDBALSDH
ABD
输出
DBA
问题解答
暂未想到较好的方法处理
题目二:大数乘法
题目描述
大数指超过int64_t可承载范围的数字
输入描述
输入两行数n1, n2 (0 < n* < 2^100)
输出描述
输出两数之积
示例1 输入
2
3
输出
6
示例2 输入
9223372024429430685
34223371424429430685
输出
315654886577740006976078312593219569225
问题解答
可以借助于java中BigInteger来得到两个大数的乘积
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
BigInteger num1 = new BigInteger(scan.nextLine());
BigInteger num2 = new BigInteger(scan.nextLine());
BigInteger res = num1.multiply(num2);
System.out.println(res);
}
}
题目三:验证字符串
题目描述
给定一个字符串 S,如果 S 满足以下要求中的任意一个则返回 true,否则返回 false:
- 全部都是大写字母,比如 "BILIBILI"
- 全部都是小写字母,比如 "bilibili"
- 首字母大写,比如 "Bilibili"
输入描述
输入为字符串,且只包含英文字母。
输出描述
输出为 true 否则 false
示例1
输入
bilibili
输出
true
示例2
输入
BiliBili
输出
false
问题解答
可以首先判断字符串的首位是否为大写,若不为大写,则条件3置为false,之后再依次遍历, 若为大写的话,则全为小写的条件不满足,将条件2置为false,若为小写的话,则全为大写的条件不满足,将条件1置为false。
public class Solution3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String data = scan.nextLine();
Boolean flag1 = true; //全大写
Boolean flag2 = true; //全小写
Boolean flag3 = true; //首字母大写
if (data.charAt(0) < 'A' || data.charAt(0) > 'Z') {
flag3 = false;
}
for (int i = 0; i < data.length(); i++) {
char c = data.charAt(i);
if (c < 'A' || c > 'Z') { //小写时
flag1 = false; //将无法全大写
} else { //大写时
flag2 = false; //将无法全小写
if (i > 0) flag3 = false; //除首字母大写外,如果其他也大写,则不满足条件三
}
if (!(flag1 || flag2 || flag3)) {
System.out.println(false);
return;
}
}
System.out.println(true);
}
}