选择题部分:
零零星星记了一些
1、若系统中有五个并发进程涉及某个相同的变量A,则变量A的相关临界区是由( )临界区构成。
5个(每个进程都需要有相关的临界区)
2、关于TCP状态
LISTEN:侦听来自远方的TCPport的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有不论什么连接状态
3、求一个简单算法的时间复杂度
4、求一个2进制数转换为16进制数,包括小数部分的转换
5、先序、中序给出一个树,求树的深度
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
6、概率题
有2个五分硬币 3个二分硬币 5个一分硬币 从中任取五个使得面值大于一角的概率是多少?
考虑三种情况:
A:取1个5分,2个2分,2个1分
B:取2个5分,其他随意
C:取1个5分,3个2分,1个1分
P=(C(1,2)*C(2,3)C(2,5)+(C2,2C(3,8)+C(1,2)*C(3,3)*C(1,5))/C(5,10)=0.5
7、如果5台机器用了5分钟来生产5个零件,那么99台机器生产99个零件要多少分钟?
5分钟
以5分钟为一个单位考虑,每台机器5分钟生产5个零件
8、120g盐,一个天平两个砝码,2g和7ge,求称出50g和70g的盐,最少需要多少次
3次
首先120g不用砝码直接对半称,称出两份60g
再从60g里面称出5g与2g砝码,与7g砝码,得出5g的盐
之后再称出5g的盐,然后混合两份5g的盐到60g的盐里面即可
9、DBMS的并发控制子系统,保证了事务()的实现
隔离性
数据库事务ACID四大特性:原子性、一致性, 隔离性, 持久性
原子性:事务中的多个数据库操作是一个不可分割的原子单元整体,只有所有的操作执行成功,整个事务才提交。
一致性:事务操作成功后,保证数据不会被破坏。
隔离性:并发控制
持久性:一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中。可恢复
10、数据库的聚合函数不能用在where语句中
聚合函数如果出现在where子句中,它就要受到整个语句的限制,因为这条语句最终是需要对数据进行筛选的,也就是说整条sql语句产生的结果将会是所有数据中的部分数据,而不是全部的完整数据。这与聚合函数实现的前提——完整的所有数据是相悖的,因此,聚合函数不能出现在where子句中。彼此相悖了!
11、关于运行态、就绪态和阻塞态的状态的转换
不能直接由阻塞态变为运行态,运行态的前一个状态一定是就绪态,下面是三态转换图
12、还有一道是啥记不清楚了。
编程部分:
1、判断一个数是否为丑数,丑数即为只有质因数2、3、5的正整数
示例:
25
true
#include <iostream>
#include <math.h>
using namespace std;
int main() {
int n;
cin>>n;
if(n<0){
cout<<"false";
}
else{
while(n%2==0){
n=n/2;
}
while(n%3==0){
n=n/3;
}
while(n%5==0){
n=n/5;
}
if(n==1){
cout<<"true";
}
else{
cout<<"false";
}
}
}
2、求一个整数数组的中位数(因为c语言的话string处理比较麻烦所以就用了java)
import java.util.Scanner;
public class shopee_2 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//以字符串形式读入整型数组
String str = sc.nextLine();
String s[]=str.split(", ");
int[] a = new int[1000];
int len=s.length;
for(int i=0;i<len;i++){
a[i]=Integer.parseInt(s[i]);
}
//整型数组排序,用了最简单的冒泡
for(int i=0;i<len-1;i++){
for(int j=0;j<len-i-1;j++){
if(a[j]>a[j+1]) {
int temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
//计算中位数
int mid;
if(len%2==0) {
mid=(a[len/2]+a[len/2-1])/2;
}
else {
mid=a[(len-1)/2];
}
System.out.print(mid);
}
}
3、10进制数转换为16进制数
#include <iostream>
#include <math.h>
using namespace std;
int main() {
int m;
cin>>m;
int a[1010];
int k=m;
int i=0;
while(k!=0){
a[i]=k%16;//求余
k=k/16; //求商
i++;
}
//十六进制数输出
for(int j=i-1;j>=0;j--){
if(a[j]==10){
cout<<"A";
}
if(a[j]==11){
cout<<"B";
}
if(a[j]==12){
cout<<"C";
}
if(a[j]==13){
cout<<"D";
}
if(a[j]==14){
cout<<"E";
}
if(a[j]==15){
cout<<"F";
}
if(a[j]>=0 && a[j]<10){
cout<<a[j];
}
}
}
一切都会好的,努力了才会有糖吃!