Java篇
在Java中,以下数据类型中,需要内存最多的是(long)
- A选项byte:占用1个字节(8位)
- B选项long:占用8个字节(64位)
- C选项Object:Object本身是一个引用,在32位JVM中占4字节,在64位JVM中占8字节。但这里指的是引用而不是对象实际占用的堆内存。
- D选项int:占用4个字节(32位)
创建数组时必须指定第一维的大小。
float f[][] = new float[6][6];这个行
float [][]f = new float[6][6];这个行
float []f[] = new float[6][6];这也行
float [][]f = new float[6][];这是创建不规则数组(交错数组)的写法。只指定第一维的大小,第二维的大小可以动态指定,这样每行可以有不同的列数。
Collection是最基本的集合接口,List,Set是继承自Collection的子接口,Map不是。
Vector线程同步,ArrayList、LinkedList线程不同步。
TreeMap中元素有序。
HashMap通过hashcode对其内容进行快速查找,但是无序。
关于以下程序输入结果是: (Not equal)
public class IfTest {
public static void main(String args[]) {
boolean x = false;
boolean y = false;
if (x = y)
System.out.println("Equal");
else
System.out.println("Not equal");
}
}
在java中,“=”表示赋值;而“==”表示判断左右两边的值是否相等,当然,如果两边都是引用对象,则比较的是地址;
if(x=y)相当于把y赋给x,if(x=false)
以下的程序输入结果是:(134)
public static void main(String args[]) {
try {
System.out.print(1);
long l = 4 / (1 - 1);
System.out.print(2);
return;
} catch (Exception e) {
System.out.print(3);
return;
} finally {
System.out.print(4);
}
}
指出下面程序的运行结果:1a2b2b
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] ars){
A ab = new B();
ab = new B();
}
}
父类静态变量(父类静态代码块)-->子类静态变量(子类静态代码块)-->父类成员变量(父类成员代码块)-->父类构造方法-->子类成员变量(子类成员代码块)-->子类构造函数
静态对象/变量优于非静态对象/变量的初始化,其中静态变量/对象只会初始化一次,非静态变量/对象可能会初始化多次;
父类优先于子类进行初始化;
如果希望某个变量只可以被类本身访问和调用,则应该使用下列哪一种访问控制修饰 (private)
private关键字是java中最严格的访问控制修饰符,保证变量或方法只能在当前类内部被访问和调用,实现了数据封装。
public是最开放的访问修饰符,可被任何类访问。
protected允许同一包内的其他类以及不同包中的子类。
equals相等的两个对象,hashcode一定相等。
单列集合顶层接口Collection
单列Collection:
(PS:集合的工具类Collections)
双列集合:
JVM篇
C/C++篇
在C语言中,关于静态变量的说法正确的是(函数中的静态变量,在函数退出后不被释放)
在函数中声明的静态变量(static)具有静态存储期,其生命周期与程序运行期相同。即使函数执行结束,静态局部变量也不会被释放,而是保持其值直到程序结束。下次调用该函数时,该变量仍保持上次的值。
静态变量和常量是不同的概念。常量是指值不可改变的量,而静态变量的值是可以改变的,只是其存储位置和生命周期与普通变量不同。
静态变量可以多次赋值和修改。
静态全局变量的作用域仅限于定义它的源文件内,不能被其他源文件访问。这体现了static关键字对变量作用域的限制作用,用于控制变量的可见性。
静态变量的主要特点是:
1. 存储在静态存储区
2. 生命周期与程序运行期相同
3. 未经初始化时自动初始化为0
4. 作用域受限于声明它的文件或函数内
下面描述中,表达正确的有(ACD)
A
公有继承是基类中的public成员在派生类中仍是public的
B
公有继承是基类中的private成员在派生类中仍是private的
C
公有继承是基类中的protected成员在派生类中仍是protected的
D
私有继承是基类中的public成员在派生类中仍是private的
对于int *pa[5] ;的描述,正确的是(pa是一个具有5个元素的指针数组,每个元素是一个int型指针)
short a[100], sizeof(a)的值是(200)
一个short变量占用2字节
void swap(int a, int b){
int t = a;
a = b;
b = t;
}
…
int x = 2;
int y = 3;
swap(x, y);
下面程序运行之后,x的值是(2)
值传而不是址传。仅仅是方法里的参数副本交换了。
要实现真正的交换,需要使用引用传递(void swap(int& a, int& b))或指针传递(void swap(int* a, int* b))。
要判断运算结果类型是否相同,需要理解Java中数值运算的类型转换规则:
1. 当操作数中有浮点数时,结果为浮点数类型
2. 除法运算中,如果除数和被除数都是整数,结果为整数;如果有一个是浮点数,结果为浮点数
给定C语言数据结构
struct T{
long w;
union U {
char c;
int i;
double d;
} u1;
} T1;
假设在64位系统下,在不考虑字对齐方式的情况下
为存储T1结构所需要的存储区域可能为(16)字节。
联合体U大小由最大成员决定。
A是重写,重写就是方法名、方法的参数和返回类型都必须相同。
C和D是重载,重载就是方法名相同,但参数不同。
设 a、b、c、d、m、n均为 int型变量,且 a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式 (m=a>b)&&(n=c>d)运算后,n的值为(C)
A0
B1
C2
D3
逻辑运算符&&(与)只有符号两边都成立才为真,当符号前边运算结果为假时,会产生“短路”,所以不再计算后面表达式的值。
数据结构篇
逻辑结构和存储结构
逻辑结构是数据元素之间的关系,存储结构是数据元素及其关系在计算机中的存储方式。
存储结构有顺序、链式、索引、散列四种,逻辑结构有线性和非线性结构。
二叉树是逻辑结构,树属于逻辑结构中的非线性结构。
双向链表、哈希表、循环队列都是存储结构分别属于链式、散列和顺序。
最大堆中插入一条数据的时间复杂度是(O(log(n)))
堆是一种满足特定条件的完全二叉树(除了最后一层的节点,其他每一层的节点都是满的,且最后一层的节点都靠左连续排列),主要可以分为两种类型。
大根堆:父节点的值大于或等于子节点的值。
小根堆:父节点的值小于或等于子节点的值。
设有一个栈,元素进栈的次序为5, 3, 7, 3, 9, 3,则栈的不可能的出栈次序是(3, 9, 5, 7, 3, 3)。
数据结构出栈顺序_哔哩哔哩_bilibili
已知一个数值有序表{3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 35},当二分查找值为31的元素时,查找失败的比较次数为(4)
18->27->33->30
如下陈述中正确的是(串是一种特殊的线性表)
字符串,由 n 个字符组成的一个整体( n >= 0 )。这 n 个字符可以由字母、数字或者其他字符组成。
空串:含有零个字符的串。
空格串:只包含空格的串。
算法篇
对于物品数量 n=4,承重 W=8 的背包问题,已知要装入背包的物品分别是
w=2,c=3(重量为2,价值为3)
w=3,c=4
w=4,c=5
w=5,c=6
每个物品最多选一次,请问往背包里最多放入价值为多少的物品(10)
使用KMP算法在主串 "abaabaabcabaabc" 中搜索模式串 "abaabc",到匹配成功时为止,请问在匹配过程中进行的单个字符间的比较次数是(10)。
【天勤考研】KMP算法易懂版_哔哩哔哩_bilibili
给出以下递归代码,问其时间复杂度是多少?O(2的n次幂)有点像二叉树
void recursiveFunction(int n) {
if (n <= 0) {
return;
}
else {
cout << n << endl;
recursiveFunction(n - 1);
recursiveFunction(n - 1);
}
}
时间复杂度为O(nlog2n)的排序算法有(快速排序、堆排序)。
设有以下四种排序方法,则(快速排序)的空间复杂度最大
A
冒泡排序
B
快速排序
C
堆排序
D
希尔排序
冒泡排序,时间复杂度O( n^2 ),空间复杂度O(1),数据结构合集 - 冒泡排序(算法过程, 算法改进, 效率分析, 稳定性分析)_哔哩哔哩_bilibili
冒泡一定是比较次数更多。
数据结构合集 - 简单选择排序(选择排序)(算法过程, 效率分析, 稳定性分析)_哔哩哔哩_bilibili
简单选择排序是不稳定的。
在顺序表(1,5,8,10,13,15,17,19,25,28,40)中,用二分法查找关键码值11,所需的关键码比较次数为4
15->8->10->13
数据库篇
事务四大特性ACID:原子性、一致性、隔离性、持久性
下列哪个SQL语句用于对当前事务设置约束模式?SET CONSTRAINTS
可以使用SET CONSTRAINTS对当前事务设置约束模式,并且主要是INITIALLY IMMEDIATE或者INITIALLY DEFERRED模式,故B项正确;
而A项的SET TRANSACTION则是设置事务的操作,故A项排除;
C项的SERIALIZABLE则是数据库隔离级别的一个选项,设置为此选项可以避免幻读,故C项排除;
IMMEDIATE则是约束模式的一种类型,D排除。
在关系数据库系统中,为了简化用户的查询操作,而又不增加数据的存储空间,常用的方法是创建(视图(view))
视图简化用户查询操作 而不是提高查询速度
软件工程篇
软件工程是一种(自顶向下)分阶段实现的软件工程开发的方法。
主键是数据库中具有唯一型的字段,也就是说数据表中的任意两条记录都不可能拥有相同的主键字段。主键值不允许为空,不允许重复。在设计数据库时可以靠设置主键来提高数据查询性能。
软件工程的基本原则包括:抽象,信息隐蔽,模块化,局部化,确定性,一致性,完备性,可验证性。
自底向上不是软件工程原则。
计网篇
TCP协议三次握手和四次挥手的过程
建立连接时,要进行三次握手。
第一次握手:客户端发送SYN包到服务器,并等待服务器确认
第二次握手:服务器收到SYN包后,向客户端发送一个确认包SYN+ACK
第三次握手:客户端收到服务器的SYN+ACK包后,向服务器发送确认包ACK
关闭连接时,要进行四次挥手。
第一次挥手:客户端发送一个FIN包,表示申请断开连接,等待服务器确认
第二次挥手:服务器回复一个ACK包,表示接受到客户端的关闭连接请求,此时服务器会检查是否还有未处理完的数据
第三次挥手:如果服务器有未处理完的数据,会继续处理,处理完毕后,会向客户端发送一个FIN包,表示可以断开连接
第四次挥手:客户端收到服务器的FIN包后,回复一个ACK包,表示确认断开连接
TCP/IP协议中不会被使用到的协议
SMTP(简单邮件传输协议)不会被使用到,因为SMTP是专门用于电子邮件传输的协议,而不是用于网站访问。
B选项HTTP: 错误,访问网站必然会使用HTTP协议,它是网络浏览器和网站服务器之间传输数据的标准协议。
C选项TCP: 错误,TCP协议负责在客户端和服务器之间建立可靠的连接,确保数据传输的完整性,是HTTP协议的底层传输协议。
D选项IP: 错误,IP协议负责网络寻址和路由,使数据包能够在互联网上正确传递到目标服务器,是整个网络通信的基础。
浏览网站的基本通信流程是:应用层使用HTTP协议进行数据交换,传输层使用TCP协议确保可靠传输,网络层使用IP协议进行路由寻址。而SMTP协议仅用于电子邮件系统,与网站访问无关。
HTTP响应码
HTTP状态码是由3位数字组成:
- 2xx(200-299):表示成功
- 3xx(300-399):表示重定向
- 4xx(400-499):表示客户端错误
- 5xx(500-599):表示服务器错误
以下哪个功能比较适合使用UDP协议?(数据多播)
UDP适合数据多播,TCP和拥塞控制,流量控制有关
使用鼠标单击一个万维网文档时,若该文档除文本外,还有3幅gif画像,且文档和3幅gif画像都在同一个服务器上,则在HTTP/2.0中需要建立(0)次UDP连接和(1)次TCP连接。
HTTP基于TCP,HTTP1.1后一个TCP连接传输多个文件
不是HTTPS相比HTTP的劣势的是(需要对传输数据进行压缩)
IPV4中,数据包传播方式包括以下的(广播、单播、组播)
在局域网模型中,数据链路层分为(逻辑链路控制子层和媒体访问控制子层)。
操作系统篇
产生死锁的4个必要条件:互斥条件、请求保持条件、不可剥夺条件 、环路条件
下面关于操作系统的说法正确的是
操作系统是管理计算机软件和硬件资源的程序集合
Linux进程中,应用可见的内存空间是一样的,是如何做到的(使用虚拟内存转换)
在用户态执行的进程,如果需要访问内核态的资源,通常会通过什么方式?直接读取内核态的内存
在 Linux 终端中,如何查找包含特定文本 "keyword" 的文件?grep keyword *
grep命令是Linux系统中最常用的文本搜索工具之一。A选项"grep keyword *"是正确的命令格式,它会在当前目录下搜索所有文件中包含"keyword"的内容。grep命令支持正则表达式,可以进行复杂的文本匹配,而且搜索结果会显示匹配行的内容和所在文件名。
B选项"find -text keyword"是错误的命令格式。find命令主要用于按照文件名、文件类型等条件搜索文件,而不是搜索文件内容。正确的find命令格式应该是"find . -name "*keyword*""。
C选项"search keyword *"是错误的,因为Linux系统中没有名为"search"的标准命令。
D选项"locate keyword"是错误的,因为locate命令是用来快速查找文件名的工具,它会在系统的文件数据库中搜索文件名,而不是搜索文件内容。
某操作系统采用信号量机制实现进程同步,共有50个进程需要访问一个共享资源。为了保证互斥访问,系统引入了一个二进制信号量作为临界区的互斥锁。现在需要选择正确的信号量初值,使得只有一个进程能够进入临界区。假设进程在进入临界区之前会尝试获取信号量,若信号量值为0,则进程会被阻塞。以下选项中,哪个是正确的信号量初值?1
操作系统中,信号量机制用于实现进程间的同步和互斥,二进制信号量是一种特殊的信号量,其值只能为0或1,通常用于实现互斥锁,确保同一时间只有一个进程可以进入临界区。
信号量工作原理:
1.初始化:信号量的初始值通常设置为1,表示资源可用。
2.P操作(等待操作):当一个进程尝试进入临界区时,会执行P操作(也称为wait操作)。如果信号量的值为1,表示资源可用,信号量的值减1,进程进入临界区。如果信号量的值为0,表示资源已被其他进程占用,当前进程会被阻塞,等待资源释放。
3.V操作(信号操作):当一个进程离开临界区时,会执行V操作(也称为signal操作),信号量的值加1,表示资源已释放,如果有等待的进程,其中一个会被唤醒,尝试进入临界区。
在一个并发编程环境中,P、V操作的信号量S初值为4,当前值为-1,则表示有多少个等待进程(1)
在 Linux Shell 中,下面创建变量的语句错误的是(name = "Tom")
1. Shell变量名可以由字母、数字和下划线组成,但不能以数字开头
2. 变量的值可以是数字、字符串等
3. 如果变量值包含空格,必须用引号(单引号或双引号)括起来
4. 变量赋值时最重要的规则就是等号两边绝对不能有空格
没学不懂,回头看
删除aaa文件夹,需要执行的操作是:rm –rf $HOME/aaa
-r 表示向下删除所有文件,-f 表示直接删除
rmdir 无法删除非空目录
linux操作系统中,修改用户密码的命令是(passwd)
?
操作系统是对(计算机资源)进行管理的软件。
下面对进程的描述中,错误的是:(进程是指令的集合)
程序是指令和数据的有序集合,是一个静态的概念。
进程是对指令的描述,进程是程序在处理机上的一次执行过程,它是一个动态的概念。
进程是由进程控制块、程序段、数据段三部分组成。
进程之间通信的途径:管道、信号量、消息队列、共享内存。
编程
字符逆序
将一个字符串str的内容颠倒过来,并输出。
如:输入“I am a student”,输出“tneduts a ma I”。
保证字符串长度不超过100。
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s=in.nextLine();StringBuilder str=new StringBuilder(s);str.reverse();System.out.println(str);}
}
一开始用的是next()方法,空格也作为终止符了。
后来用的是nextLine()方法,这回每次读取整行字符串,包含空格。
删除有序数组重复元素
给定一个整形数组 nums,固定升序排列,请你删除重复元素,返回删除后数组的新长度。
import java.util.HashSet;
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s= in.nextLine();String arr[]=s.split(",");HashSet set=new HashSet<>();for (int i = 0; i < arr.length; i++) {set.add(arr[i]);}System.out.println(set.size());}
}
split()分割
set可去重
在字符串中找出连续最长的数字串
现有一个字符串str,输出字符串str中的最长的数字子串。
import java.util.ArrayList;
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s= in.nextLine();char[] array = s.toCharArray();ArrayList strs=new ArrayList<>();String str="";for (int i = 0; i < array.length; i++) {if (Character.isDigit(array[i])){str+=array[i];if (i== array.length-1)strs.add(str);}else {strs.add(str);str="";}}//分割int max=0;int index=0;for (int i = 0; i < strs.size(); i++) {str=(String) strs.get(i);max=Math.max(str.length(),max);if (max==str.length())index=i;}System.out.println(strs.get(index));}
}
Character.isDigit(array[i]) //判断字符array[i]是不是数字
在一个字符串中找到出现指定次数的字符并通过控制台输出
如输入abaccdeff及1,则通过控制台输出:
b
d
e
如输入abaccdeff及2,则通过控制台输出:
a
c
f
import java.util.*;class Main{public static void main(String[] args) {Scanner sc=new Scanner(System.in);String str= sc.next();int n= sc.nextInt();char[] charArray = str.toCharArray();Set<Character> set=new HashSet<>();for (char c : charArray) {set.add(c);}Set<Character> set1=new HashSet<>();for (Character o : set) {int t=0;for (int i = 0; i < charArray.length; i++) {if(o==charArray[i]){t++;}}if (t==n){set1.add(o);}}for (Character c : set1) {System.out.println(c);}}
}
set可去重,map键值对。
薯券使用问题(无限背包/硬币找零问题)[动态规划]
某小红薯在小红书的活动中抽奖中了一定价值的薯券,这些薯券可以用来购买一批商品,求有多少种购买组合。其中一件商品可以买多件。
输入:薯券金额、商品分别价格
输出:组合数